首先class類裡的內建方法,比如:__call__,__str__這些都是在一定條件下自動執行的。
下面我們來介紹幾個內建方法
1、__str__ #先講講他的作用,在print列印物件的時候會自動觸發執行
#例子1:
class
student:
def__init__
(self,name,age):
self.name =name
self.age =age
stu1 = student('
zhuyu
',19)
print(stu1) #
執行原理就是,先在student類裡找__str__方法,沒有就去他的父類找
print(object.__str__(stu1)) #
驗證了student的父類裡面有__str__方法
#輸出結果是:
#<__main__.student object at 0x0000023a1170c128>
#<__main__.student object at 0x0000023a1170c128>
#例子2:
#我們可以在student類自己定義乙個__str__方法來驗證,執行print列印操作,原理#是執行了__str__方法的
class
student:
def__init__
(self,name,age):
self.name =name
self.age =age
def__str__
(self):
(self.name)
return
'' %(self.name,self.age)
stu1 = student('
zhuyu
',19)
print(stu1) #
這個stu1就是__str__的返回值
#輸入結果是:
#zhuyu
##補充一下,物件的查詢屬性的順序:物件自己的命名空間,物件對應類的命名空間,該類的基類的命名空間
2、__del__方法 #作用是,會在刪除物件之前自動觸發該方法
#我就直接上**吧
class
student:
def__init__
(self, name, age):
self.name =name
self.age =age
def__del__
(self):
print('
%s 已經被刪除
' %self.name)
stu1 = student('
zhuyu
', 19)
stu2 = student('
zhanghao
', 19)
print('主'
)#他的執行結果是#主
#zhuyu 已經被刪除
#zhanghao 已經被刪除
###講講為什麼是這個輸出結果:這個python直譯器的垃圾**機制吧,乙個程式執行完畢,python會**該程式在記憶體中產生的資料,當執行到print('主'),
###後面沒有**執行了,就會刪掉stu1,stu2這兩個物件,刪除這兩個物件之前呢,會執行__del__方法,所以會出現上面的結果。
3、__call__ #在呼叫該物件時,也就是例項化的時候,會自動執行其類和類的基類中的__call__方法,如果沒有的,那麼該物件是不可呼叫的物件
classstudent: #補充:class student: 相當於就是 student = type(類名,該類的基類們,類體**產生的命名空間)
pass
student()
## 分析一下:首先一切皆物件,student就是乙個物件,student他是通過元類(type)例項化得來的,所以說呼叫student(),就是去找type元類中
#找__call__方法去執行,很明顯type類中有__call__方法,執行上面那段**,不會出錯。
# 下面舉個例子來驗證下上面的結論class student: # (相當於上面例子的type)
def __init__(self, name, age):
self.name = name
self.age = age
stu1 = student('zhuyu', 19) # stu1(相當於上面例子的student)
try: # 這裡我們通過捕捉異常來列印出錯原因
stu1() # 這裡相當於上面student()
except exception as e:
print(e)
# 列印結果是:'student' object is not callable
# 「student」物件不可呼叫,也就是stu1是不可呼叫的
###結論:通過這兩個例子可以得到,只要該物件的類中有__call__方法,那該物件就可以呼叫,也就是例項化。
###該物件例項化,就是執行其類中的__call__方法
###驗證下:該物件例項化,就是執行其類中的__call__方法
class teacher:
def __init__(self, name):
self.name = name
def __call__(self, *args, **kwargs):
print('我被%s呼叫了' % self.name)
tea1 = teacher('zhuyu')
tea1()
#輸出結果是:我被zhuyu呼叫了
###如何通過元類來控制類的呼叫
#通過在自定義元類裡的__call__方法,來實現對類的呼叫控制
#1、首先類的呼叫原理就是執行元類裡的__call__方法
#2、通過__call__方法來實現對物件的初始化操作
class mymeta(type):def __call__(self, *args, **kwargs): # self就是student *args和**kwargs就是student後面的引數
# print(self)
# print(args)
# print(kwargs)
obj = self.__new__(self) # 就是建立乙個student的空物件
self.__init__(obj, *args, **kwargs) # 執行__init__方法 這裡需要注意查詢順序
return obj # 將例項化完的物件返回回去
class student(object, metaclass=mymeta):
def __init__(self, name, age):
self.name = name
self.age = age
stu1 = student('zhuyu', age=19)
print(type(stu1),stu1.__dict__)
這就是類的例項化的整個過程,不過這是我們通過自定義元類來控制類的呼叫,也就是再__call__多些**而已
在預設元類type裡,肯定有__call__方法,該方法下面就是產生個空物件,再執行__init__方法
先講到這三個方法,其他那些__dict__,__class__,__name__這些就不說了
物件導向內建方法
判斷obj是否是cls類的物件 例 li 1,2,3,4 def run list li for i in li if isinstance i,list run list i else print i run list li 判斷sub是否是super的派生類通過字串的形式操作物件的相關屬性 1 ...
幾個內建物件
outexception隱式物件 取得元件配置資訊中的引數 當使用者通過對映名訪問元件時,服 務器在專案的部署檔案web.xml中取得該元件。並且可以在該元件中通過config.getinitparameter 方法,從config內建物件中取得該元件在專案的部署檔案web.xml中的配置資訊中 的...
python 物件導向的內建方法
要求 了解即可,能用最好 1.print obj str obj s obj 都呼叫obj.str 方法,若類中沒有找 repr 方法,若沒有找父類的 str 方法,若沒有找 repr 方法,直到object 2.r obj repr obj 都呼叫obj.repr 方法,若類中沒有找到 repr ...