python基础笔记-6

面向对象

 

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)
 


你可能感兴趣的:(Python)