类的三大特征就是:封装,继承,多态。
封装
最常用的解释就是,封装就是将数据和基于数据的操作封装在类中,隐藏内部的数据,对外只提供公共的访问接口。封装就是为了把一些变量和函数信息保存起来,不让外界调用。
私有属性
私有属性有两种,第一种名字前带一个下划线的是约定俗成的写法(外界可以调用,但不建议调用),第二种就是名字前面带两个下划线的属性(标准的私有属性,类外部不可以调用,但可以通过一些方法来实现调用)。
class Cat:
def __init__(self,name,password):
#可以用一个或两个下划线来标识私有属性
#一个下划线的属性标识外部不应该调用,但还是可以直接调用
self._name = name
#两个下划线的属性是标准的私有属性,只有在当前类中可以调用,子类都不行,但也有办法调用
self.__password = password
#返回标准私有属性到终端
def get__password(self):
return self.__password
#修改标准私有属性的值
def set__password(self,value):
self.__password = value
继承
继承主要就是为了少写代码,父类中有的方法如果在子类中合适就不需要再写一遍了。
class Animal:
def __init__(self,name,age):
self.name = name
self.age = age
def get_name(self):
return self.name
def set_name(self,value):
self.name = value
#Dog类继承了Animal类
class Dog(Animal):
def say():
print('wang wang wang......')
#Cat类继承了Animal类
class Cat(Animal):
def say():
print('miao miao miao......')
dog = Dog('qiqi',12)
dog.get_name()
dog.set_name('qiqisile') #把name属性的值qiqi改为qiqisile
dog.get_name()
dog.say()
多重继承
多重继承时,从父类继承属性的顺序是深度优先、从左至右。当调用一个属性或方法时,从最左边的第一个父类中开始寻找,然后再从第一个父类的父类、祖宗类中寻找,如果都没找到,则从第二个父类开始寻找(操作同第一个父类一样)。
多态
如果父类和子类中存在相同的方法,那么子类在调用该方法时,实际调用的就是子类的方法。这就是多态。
class Animal:
def __init__(self, name):
self.name = name
def get_name(self):
return self.name
def set_name(self, value):
self.name = value
def say(self):
print('这个动物在叫')
class Dog(Animal):
def say(self):
print('wang wang wang...')
class Cat(Animal):
def say(self):
print('miao miao miao...')
特殊方法
最疑惑的就是__new__方法和__init__方法了吧。
__new__(cls)是创建实例对象的方法,cls则是类本身(第一个参数必须是cls),该方法主要是初始化方法,即创建实例对象的同时给对象绑定属性。(在实例对象被创建之前调用)
__init__(self)用于设置实例对象的初始值,self是实例本身(第一个参数必须是self)。(在实例对象创建完成后调用)
__del__(self)用于销毁实例对象。
__repr__()用于格式化实例的打印样式。
__slots__限制绑定属性。
__call__(self)是使实例变成可调用对象,用callable来判断是否为可调用对象。