新式类和经典类的区别类的特殊方法单例模式
生活随笔
收集整理的這篇文章主要介紹了
新式类和经典类的区别类的特殊方法单例模式
小編覺得挺不錯的,現(xiàn)在分享給大家,幫大家做個參考.
目錄:
- 新式類和經(jīng)典類的區(qū)別
- 重寫特殊的構(gòu)造方法
- 類的特殊方法
- 單例模式原理及作用
新式類和經(jīng)典類的區(qū)別:
1)首先,寫法不一樣:
class A: #經(jīng)典類寫法passclass B(object): #新式類寫法pass2)多繼承中,新式類采用廣度優(yōu)先搜索,而舊式類是采用深度優(yōu)先搜索,python3中全是廣度優(yōu)先
3)在繼承中新式類和經(jīng)典類寫法區(qū)別
SchoolMember.__init__(self,name,age,sex) #經(jīng)典類寫法super(Teacher,self).__init__(name,age,sex) #新式類寫法
代碼展示
重寫特殊的構(gòu)造方法
新式類,經(jīng)典類,無超類構(gòu)造方法報錯
class Bird:def __init__(self):self.hungry = Truedef eat(self):if self.hungry == True:print("Aaaah...")self.hungry = Falseelse:print("no, thanks") a = Bird() a.eat() a.eat()class SongBird(Bird):def __init__(self):# Bird.__init__(self) # 經(jīng)典類寫法# super(SongBird,self).__init__() # 新式類寫法self.sound = 'Squawk'def sing(self):print(self.sound) b = SongBird() b.sing() b.eat()類的特殊方法
__doc__ 表示類的描述信息 class Foo:""" 輸出類的描述類信息 """def func(self):pass print(Foo.__doc__) #運(yùn)行結(jié)果:描輸出類的描述類信息 __call__ 對象后面加括號,觸發(fā)執(zhí)行- 作用:構(gòu)造方法__init__的執(zhí)行是由創(chuàng)建對象觸發(fā)的,即:對象 = 類名()
- 對于 call 方法的執(zhí)行是由對象后,括號觸發(fā)的,即:對象() 或者 類()()
執(zhí)行__call__方法
class Dog(object):def __init__(self,name):self.name = '實例變量'self.name = namedef __call__(self, *args, **kwargs):print("running call")print(args,kwargs) d = Dog("ChenRonghua") d(name='tom') # 如果只實例化,而不d()調(diào)用,__call__函數(shù)不會執(zhí)行# 運(yùn)行結(jié)果: # running call # () {'name': 'tom'} __str__ 如果一個類中定義了__str__方法,在打印對象時,默認(rèn)輸出該方法的返回值** class Foo:def __str__(self):return 'alex li' obj = Foo() print(obj) # 輸出:alex li __dict__ 查看類或?qū)ο笾械乃谐蓡T class Province:country = 'China'def __init__(self, name, count):self.name = nameself.count = countdef func(self, *args, **kwargs):print('func') # 獲取類的成員,即:靜態(tài)字段、方法、 print(Province.__dict__) # 輸出:{'country': 'China', '__module__': '__main__', 'func': <function func at 0x10be30f50>, '__init__': <function __init__ at 0x10be30ed8>, '__doc__': None}obj1 = Province('HeBei',10000) print(obj1.__dict__) # 獲取 對象obj1 的成員 # 輸出:{'count': 10000, 'name': 'HeBei'}obj2 = Province('HeNan', 3888) print(obj2.__dict__) # 獲取 對象obj1 的成員 # 輸出:{'count': 3888, 'name': 'HeNan'} _getitem__、__setitem__、__delitem__ 作用:用于索引操作,如字典。以上分別表示獲取、設(shè)置、刪除數(shù)據(jù) class Foo(object):def __getitem__(self, key):print('__getitem__', key)def __setitem__(self, key, value):print('__setitem__', key, value)def __delitem__(self, key):print('__delitem__', key)obj = Foo() result = obj['k1'] # __getitem__ k1 obj['k2'] = 'wupeiqi' # __setitem__ k2 wupeiqi del obj['k1'] # __delitem__ k1 __new__ \ __metaclass__ 作用: __metaclass__定義這個類以怎樣的形式被創(chuàng)建 class User(object):def __init__(self,name,age):print('__init__')def __new__(cls, *args, **kwargs):print("__new__",args,kwargs)return object.__new__(cls) # 調(diào)用一下object的__new__方法否則不往下走 d = User('tom',100)# 運(yùn)行結(jié)果: # __new__ ('tom', 100) {} # __init____new__和__init__的區(qū)別
- __new__是一個靜態(tài)方法,而__init__是一個實例方法.
- __new__方法會返回一個創(chuàng)建的實例,而__init__什么都不返回.
- 只有在__new__返回一個cls的實例時后面的__init__才能被調(diào)用.
- 當(dāng)創(chuàng)建一個新實例時調(diào)用__new__,初始化一個實例時用__init__.
type生成類調(diào)用順序
- new : 先于__init__方法,每生成一個實例執(zhí)行一次
- init : __init__方法每生成一個實例對象就會執(zhí)行一次
- call : 后與__init__方法,C()() 使用類再加一個括號調(diào)用, C為類名稱
- del : 析構(gòu)方法,刪除無用的內(nèi)存對象(當(dāng)程序結(jié)束會自動自行析構(gòu)方法)
單例模式原理及作用
創(chuàng)建單例模式舉例
class Foo(object):instance = Nonedef __init__(self):self.name = 'alex'def __new__(cls, *args, **kwargs):if Foo.instance:return Foo.instanceelse:Foo.instance = object.__new__(cls,*args,**kwargs)return Foo.instanceobj1 = Foo() # obj1和obj2獲取的就是__new__方法返回的內(nèi)容 obj2 = Foo() print(obj1,obj2) # 運(yùn)行結(jié)果: <__main__.Foo object at 0x00D3B450> <__main__.Foo object at 0x00D3B450># 運(yùn)行結(jié)果說明: # 這可以看到我們新建的兩個Foo()對象內(nèi)存地址相同,說明使用的?同一個類,沒有重復(fù)建立類參考來自于此
總結(jié)
以上是生活随笔為你收集整理的新式类和经典类的区别类的特殊方法单例模式的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: Docker file 搭建 Nginx
- 下一篇: while和for循环读取大文件三种读取