面向对象
Python是动态语言,可以给对象动态添加属性和方法。
魔法方法
__str__ 对象的字符串形式,print函数打印对象时,对象的__str__函数被调用,其返还的内容被打印。
私有属性和私有方法
以__开头,在类外部不能直接使用
__del__ 方法
对象被释放(引用计数为0)时Python解释器自动调用
sys.getrefcount(a)获取对象的引用计数,得到的值比实际值大1,因为函数中参数也指向了传入的对象。
在子类中调用同名的父类中的方法,Animal.func(self)
或者super().func()
子类不能访问父类的私有属性和私有方法
多继承时需要注意方法的搜索顺序
__mro__可以显示该顺序
类本身也是一个对象。
类属性所有对象共用一个,实例属性属于单独一个对象
类属性类似C++中的静态属性
通过类名访问
类方法、静态方法、实例方法
类方法前加@classmethod,参数cls代表对应的类。
调用时通过类名访问,也可以用实例对象调用。
静态方法前加@staticmethod,他可以没有参数。
通过类名调用,或者实例对象调用。
__new__(cls) 方法
创建对象,未定义则由object的__new__创建。如果重写,则需要在重写的__new__中调用object的__new__方法,并将对象引用返回。
单例模式,可以通过重写__new__和__init__实现,并且使用类属性保存实例对象。
class Dog(object):
'''单例类-Dog'''
#保存实例对象
__instance = None
#标识是否初始化
__init_flag = False
#重写该方法,注意参数,与调用时保持一致,name一般用不到,但是要写上
def __new__(cls, name):
#如果未创建对象,则调用object的__new__方法创建并保存
#否则直接返回之前创建的实例对象
if cls.__instance == None:
cls.__instance = object.__new__(cls)
returncls.__instance
def __init__(self, name):
#保证只初始化一次
if not Dog.__init_flag:
Dog.__init_flag = True
self.name= name
if __name__ == '__main__':
a= Dog('旺财')
print(id(a))
print(a.name)
b= Dog('阿黄')
print(id(b))
print(b.name)