物件導向 幾個內建方法

2022-02-09 08:57:40 字數 3766 閱讀 3253

首先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):

print

(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__方法,如果沒有的,那麼該物件是不可呼叫的物件

class

student: #補充: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 ...