面向对象是个抽象的东西, 概念比较多, 下面会一一介绍
一类和实例
类 (Class) 和实例 (Instance) 是面向对象最重要的概念
类是指抽象出的模板实例则是根据类创建出来的具体的对象, 每个对象都拥有从类中继承的相同的方法, 但各自的数据可能不同
- class Student(object):
- pass
- kate = Student()
关键字 class 后面跟着类名, 类名通常是大写字母开头的单词, 紧接着是(object), 表示该类是从哪个类继承下来的通常, 如果没有合适的继承类, 就使用 object 类, 这是所有类最终都会继承下来的类
Student 就是类名, kate 就是 Student()的实例, 类只有实例化以后才能使用
二构造函数, 析构函数, 类变量, 实例变量
构造函数:__init__(self,name,age,sex), 这个方法就是构造函数, 在实例化的时候自动调用所有如果这个函数内有打印的方法, 当 kate 实例出来的时候会打印里面的信息
__init__方法的第一个参数永远都是 self, 表示创建实例本身, 在__init__方法内部, 可以把各种属性绑定到 self, 因为 self 指向创建的实例本身
有了__init__方法, 在创建实例的时候, 就不能传入空的参数了, 必须传入与__init__方法匹配的参数, 但 self 不需要传, Python 解释器自己会把实例变量传进去
析构函数:__del__(self), 这个方法就是析构函数, 是在实例被销毁时自动调用的
类变量: country = China , 类变量不需要实例, 可以直接使用, 如 line 14
实例变量: self.name = name, self.name 这种形式就是实例变量, 需要实例化后才能使用, 如 line15 就会报错, 需要实例化 line16 的 kate, 才能使用 name, age, sex
可以自由地给一个实例变量绑定属性, 比如, 给实例 kate 绑定一个 language 属性
kate.language = 中文
print(kate.language) #中文
和普通函数相比, 在类中定义的函数只有一点不同, 就是第一个参数永远是实例变量 self, 并且, 调用时, 不用传递该参数除此之外, 类的方法和普通函数没有什么区别比如 school 函数只需要传 city 就可以了
kate.school(北京) #凯特在北京上学
下面是具体的代码段例子
- class Person(object):
- country = China #类变量, 不需要实例化, 可以直接用
- def __init__(self,name,age,sex):# 构造函数, 实例化的使用自动调用
- self.name = name #实例变量, 必须实例化之后才能用, 也叫成员变量
- self.age = age
- self.sex =sex
- def say_my_country(self):
- print(self.country)# 类变量可以在类里作为属性使用
- def school(self,city):
- self.city = city
print(%s 在 %s 上学 %(self.name,self.city))
def __del__(self):# 析构函数, 实例销毁的时候自动调用
print(实例销毁的时候自动调用)
- print(Person.country)# 类变量, 不需要实例化, 可以直接用
- #print(Person.name)# 实例变量, 必须实例化之后才能用, AttributeError: type object Person has no attribute name
kate = Person(凯特, 18, 女)
- print(kate.name)
- print(kate.age)
- print(kate.sex)
- print(kate.country) #China
- kate.say_my_country() #China
kate.language = 中文
print(kate.language) #中文
kate.school(北京) #凯特在北京上学
三访问限制
在 Class 内部, 可以有属性和方法, 而外部代码可以通过直接调用实例变量的方法来操作数据, 这样就隐藏了内部的复杂逻辑
kate = Person(凯特, 18, 女)
kate.name = 王菲
print(kate.name)
如果加这句代码 line2,kate.name = 王菲, 这样执行 line3 就会打印王菲, 而不是凯特, name 会修改了
四私有变量, 私有函数, 静态方法, 类方法
私有变量: self.__host = host , 只能在类里使用, 如果执行 line31 会报错 AttributeError: MyRedis object has no attribute __host
私有函数: def __conn_redis(self), 只能在类里使用, 执行 line32 会报错 AttributeError: MyRedis object has no attribute __conn_redis
静态方法: 需要加 @staticmethod, 不需要实例化就能直接用, 其实和类没有什么关系, 就是一个普通的函数, 写在了类里面而已, 也用不了 self 的那些东西, 也调用不了类里的其他函数
类方法: 需要加 @classmethod, 不需要实例化就能直接用, 它比静态方法高级一点, 它可以使用类变量和类方法, 如函数 class_fun(cls)
- import redis
- class MyRedis():
hi= 哈哈
- def __init__(self,host,db,password=,port=6379):
- self.__host = host # 私有变量, 只能在类里使用
- self.passwd = password
- self.port = port
- self.db = db
- #self.conn_redis()
- self.__conn_redis()
- # def conn_redis(self):
- # self.conn = redis.Redis(host=self.__host,db=self.db,password=self.passwd,port=self.port)
- def __conn_redis(self): #私有函数, 只能在类里使用
- self.conn = redis.Redis(host=self.__host,db=self.db,password=self.passwd,port=self.port)
- def get(self,k):
- print(__host...,self.__host)
- return self.conn.get(k).decode()
- @staticmethod #静态方法
- def other():
print(我是 other)
- @classmethod #类方法, 也不需要实例化, 直接就能用, 它比静态方法高级一点, 它可以使用类变量和类方法
- def class_fun(cls):
- print(cls.hi) #可以调用类变量
- cls.class_fun2()# 可以调用类方法
- @classmethod
- def class_fun2(cls):
print(类方法 2)
- r = MyRedis(localhost,3)
- # print(r.__host) #AttributeError: MyRedis object has no attribute __host
- #r.__conn_redis() #AttributeError: MyRedis object has no attribute __conn_redis
- print(r.get(kate11))
- MyRedis.other() #静态方法不需要实例化
- MyRedis.class_fun()
五继承
在 OOP 程序设计中, 当我们定义一个 class 的时候, 可以从某个现有的 class 继承, 新的 class 称为子类(Subclass), 而被继承的 class 称为基类父类或超类(Base classSuper class)
比如, 我们已经编写了一个名为 Animal 的 class, 有一个 run()方法可以直接打印一句话, 然后新建一个叫 Dog 的类, 继承了 Animal 类
所以 Dog 可以用 Animal 类里的函数 run(), eat(), 同时自己也可以定义自己的函数
@property , 这是个装饰器, 把函数变成一个属性方法, 如果这个方法没有入参的话, 那就可以变成一个属性方法
在使用的时候可以如下面代码所示的 b.protect, 而不是像其他的方法一样加(), 如 b.bite()
- class Animal(object):
- def run(self):
- print(running...)
- def eat(self):
- print(eating...)
- class Dog(Animal):
- def run(self):
- print(dog is running)
- def bite(self):
- print(dog will bite people.)
- @property
- def protect(self):
- print(dog will protect people.)
- a = Animal()
- a.run()
- a.eat()
- b = Dog()
- b.run()
- b.eat()
- b.bite()
- b.protect #属性方法, dog will protect people.
来源: http://www.bubuko.com/infodetail-2506893.html