面向对象编程(第五篇)
生活随笔
收集整理的這篇文章主要介紹了
面向对象编程(第五篇)
小編覺得挺不錯的,現在分享給大家,幫大家做個參考.
__new__
1.調用特殊方法__new__()創建實例對象
查找該類對象是否實現了特殊方法__new__(),如果沒有實現,則去其父類中依次查找,直到類對象object
2.調用特殊方法__init__()對創建的實例對象進行初始化
__new__()返回的實例對象會作為實參數被自動傳遞給__init__()的第一個形參self
class Parent(object):def __new__(cls,*args,**kwargs):pass class Child(Parent):def __init__(self,name):pass id(Parent) >2596561457880 id(Child) >2596561481480 class Parent(object):def __new__(cls,*args,**kwargs):print("父類的__new__()被調用,其形參cls對應實參的id",id(cls))obj = super().__new__(cls)print("創建的實例對象的id",id(obj))return obj class Child(Parent):def __init__(self,name):print("子類的__new__()被調用,其形參cls對應實參的id",id(self))self.name = name子類實例化,子類把地址傳給父類,父類運作,父類再把地址傳給子類
child = Child("Mike") >父類的__new__()被調用,其形參cls對應實參的id 2596561451272 創建的實例對象的id 2596568411608 子類的__new__()被調用,其形參cls對應實參的id 2596568411608 print("父類Parent的id:",id(Parent)) print("子類Child的id:",id(Child)) print("創建的實例對象的id:",id(child)) >父類Parent的id: 2596561482424 子類Child的id: 2596561451272 創建的實例對象的id: 2596568411608__getitem__(),__setitem__(),__delitem__()
如果想讓自定義類對象的實例對象可以像列表和字典那樣,使用中括號語法來操作數據
1.getitem(self,key)
當執行操作obj[key]時,會自動調用該特殊方法
2.setitem(self,key,value)
當執行操作obj[key] = value時,會自動調用該特殊方法
3.delitem(self,key)
當執行操作del obj[key]時,會自動調用該特殊方法
class MyDict(object):def __init__(self):self.data = {}def __getitem__(self,key):return self.data[key]def __setitem__(self,key ,value):self.data[key] = valuedef __delitem__(self,key):del self.data[key] md = MyDict() md["one"] = 18 md["two"] = 32 print(md.data) >{'one': 18, 'two': 32}刪除
del md["two"] print(md.data) >{'one': 18}call()
如果在類對象中實現了特殊方法__call__(),那么就可以像調用函數一樣直接調用這個類對象的實例對象,從而會自動調用特殊方法__call__()。
class MyClass(object):def __call__(self,*args,**kwargs):print(args,kwargs) mc = MyClass() mc() >() {} mc(1,2,x=3,y=4) >(1, 2) {'x': 3, 'y': 4}內置函數callable用于判斷指定對象是否是可調用的。
除了函數對象是可調用的之外,對于實現了特殊方法__call__()的類對象,其實例對象也是可以調用的。
#內置函數 callable(print) >True #自定義函數 def my_fun():pass print(callable(my_fun)) >True #實現了特殊方法__call__()的類對象,其實例對象也是可以調用的。 print(callable(MyClass)) >True__doc__
通過類對象的特殊屬性__doc__可以訪問類對象的文檔字符串
class MyClass(object):"""123"""def __call__(self,*args,**kwargs):print(args,kwargs) mc = MyClass() mc() print(MyClass.__doc__) > 123特殊屬性__slots__
如果想要對實例對象動態綁定的屬性和方法的名稱進行限制,可以在其對應的類對象中定義特殊屬性__slots__,并給__slots__賦值一個所有元素都為字符串的列表或元組,這樣,對實例對象動態綁定的屬性和方法的名稱就只能來自于__slots__中的元素。
class MyClass(object):__slots__ = ("attrl","do_sth1") mc = MyClass() mc.attrl = 18 print(mc.attrl) >18不在名單內
mc.attr2 = 12>--------------------------------------------------------------------------- AttributeError Traceback (most recent call last) <ipython-input-34-afd3ca596a00> in <module>() ----> 1 mc.attr2 = 12AttributeError: 'MyClass' object has no attribute 'attr2' def do_sth1(self):print("do_sth1被調用了") from types import MethodType mc.do_sth1 = MethodType(do_sth1,mc) mc.do_sth1() >do_sth1被調用了不在名單內
def do_sth2():print("do_sth2被調用了") mc.do_sth2 = MethodType(do_sth2,mc)>--------------------------------------------------------------------------- AttributeError Traceback (most recent call last) <ipython-input-6-d60ee0e54e8c> in <module>()1 def do_sth2():2 print("do_sth2被調用了") ----> 3 mc.do_sth2 = MethodType(do_sth2,mc)AttributeError: 'MyClass' object has no attribute 'do_sth2'在類對象中定義特殊屬性__slots__可以提高屬性的訪問速度
在類對象中定義特殊屬性__slots__可以減少內存消耗
繼承了有__slots__的父類,子類沒有,則可以隨意定義
繼承了有__slots__的父類,子類有,則父類子類的方法屬性都有
總結
以上是生活随笔為你收集整理的面向对象编程(第五篇)的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 渤海银行信用购和花呗有什么区别
- 下一篇: 贷款的基本程序是什么