魔術方法 python python的魔術方法

2021-10-11 15:03:41 字數 2721 閱讀 7702

什麼叫魔術方法:

在python中定義以雙下劃線開頭,有一些python自定義的函式,並且以雙下劃線為結尾的函式叫做魔法函式

classcompany(object):def __init__(self, employee_list):

self.employee=employee_listdef __getitem__(self, item):returnself.employee[item]def __len__(self):returnlen(self.employee)

company= company(["tom", "bob", "jane"])

company1= company[:2]print(len(company))for em incompany1:print(em)

當中間定義了__getitem__方法,就將company變成了乙個可迭代物件,呼叫for迴圈時,python會乙個乙個嘗試,直到報錯。所以列印print(len(company1))不會報錯

__subclasshook__:

這個魔術方法有什麼用呢?

使用__subclasshook__後只要具體類定義了與抽象類相同的方法就認為是他的子類

importabcclassa(object):__metaclass__ =abc.abcmeta

@abc.abstractmethoddefsay(self):return 'say yeah'@classmethoddef __subclasshook__(cls, c):if cls isa:if any("say" in b.__dict__ for b in c.__mro__):returntruereturnnottmplementdclassb(object):defsay(self):return 'hello'

print issubclass(b, a) #true

print isinstance(b(), a) #true

print b.__dict__ #

print a.__subclasshook__(b) #true

3,__getattr__ 和__getattribute__區別

#__getattr__, __getattribute__#__getattr__ 就是在查詢不到屬性的時候呼叫

from datetime importdateclassuser:def __init__(self, info={}):

self.in fo=infodef __getattr__(self, item):returnself.info[item]#def __getattribute__(self, item):

#return "bobby" 這個是任何時候都會 進入的,不管是否報錯

if __name__ == "__main__":

user= user(info=)print(user.test)

首先呼叫__getattribute__。如果類定義了__getattr__方法,

那麼在__getattribute__丟擲 attributeerror 的時候就會呼叫到__getattr__,

4,property_test

from datetime importdate, datetimeclassuser:def __init__(self, name, birthday):

self.name=name

self.birthday=birthday

self._age= 0 #宣告不想被修改的屬性

#def get_age(self):

#return datetime.now().year - self.birthday.year

@propertydefage(self):return datetime.now().year -self.birthday.year

@age.setterdefage(self, value):

self._age=valueif __name__ == "__main__":

user= user("bobby", date(year=1987, month=1, day=1))

user.age= 30

print(user._age)print(user.age)

其實property主要的作用就是將方法的呼叫偽裝為乙個屬性的查詢方式

5,__new__和__init__區別

classuser:def __new__(cls, *args, **kwargs):print("in new")return super().__new__(cls)def __init__(self, name):print("in init")passa=int()#new 是用來控制物件的生成過程, 在物件生成之前#init是用來完善物件的#如果new方法不返回物件, 則不會呼叫init函式

if __name__ == "__main__":

user= user(name="bobby")

執行結果如下:

innewin init

__new__在python3新式類才有的,python2.2之前中是沒有的,這個方法允許我們在生成物件之前加邏輯,

所以他傳入的引數是cls類。和__init__的根本區別在於,__new__可以自定義類的生成過程的,在__init__之前,不管是傳參也好,不傳參也好,都需要經過__new__方法

new 是用來控制物件的生成過程, 在物件生成之前

init是用來完善物件的

一般在框架中見得多。(用於元類程式設計)

middles函式python python 函式

1.特性 1.1.可擴充套件性 1.2.減少 重複 1.3.程式更容易維護 2.函式的引數與區域性變數 2.1.函式裡面的 arges 元組形式儲存,kwarges 字典方式儲存,可以寫成其他,但是 必須寫 2.2.函式裡面入參可以是預設引數,固定引數,位置引數,關鍵字引數,非固定引數的 3.返回值...

discard函式python Python 集合

python 集合讀書之法,在循序而漸進,熟讀而精思。朱熹 集合的概念無序 不能重複 集合中各元素間是無序的,相同元素在集合中唯一存在.即集合是無序組合,它沒有索引和位置的概念,但可變集合中的元素是可以動態新增或者刪除的 集合的型別可變集合 set 不可變集合 frozenset set 函式 可以...

with 魔術方法

with open demo1.py as fp print fp.read enter self exit enter 魔術方法 使用with語句的時候,會呼叫這個魔術方法 這個方法的返回值可以作為as x的值 exit self,exc type,exc val,exc tb 魔術方法 1.執行...