Python學習筆記二十四 元類

2021-08-20 07:18:05 字數 4524 閱讀 9264

__class__屬性

__class__屬性可以檢視物件的型別.

class

person

(object):

pass

person = person()

print(person.__class__)

# 執行結果

#

person 類的例項物件person 的型別時person 類型別, python 是物件導向的語言, 那麼person 的類物件的型別又是什麼?

class

person

(object):

pass

person = person()

print(person.__class__)

print(person.__class__)

# int 的型別

print(int.__class__)

# str 的型別

print(str.__class__)

# 執行結果

# #

# #

person / int / str 的類物件的型別都是type 類型別.

那麼type類物件 的型別又是什麼型別?

class

person

(object):

pass

print(person.__class__.__class__)

# int 的型別

print(int.__class__.__class__)

# str 的型別

print(str.__class__.__class__)

print(type.__class__)

# 執行結果

# #

# #

type 類物件的型別還是type 類型別, 那麼type 類是幹嘛的?

type 類是元類, python中所有的類預設都是使用type 類建立的, type 類屬於python中的高深魔法, 一般很少用到.

"""

type(object_or_name, bases, dict)

type(object) -> the object's type

type(name, bases, dict) -> a new type

"""

type類有兩個功能,

type(object)

class

person

(object):

pass

person = person()

print(type(person)) # 檢視person 例項物件的型別

print(type(person)) # 檢視person 類物件的型別

# 執行結果

# #

type(name, bases, dict)

使用type 建立乙個類

正常建立person 類的子類teacher

class

person

(object):

pass

class

teacher

(person):

def__init__

(self):

self.name = "teacher"

# help() 函式用於檢視函式或模組用途的詳細說明。

print(help(teacher))

元類建立person 類的子類student

class

person

(object):

pass

def__init__

(self):

self.name = "student"

# "student" 是類名

student = type("student", (person,), )

# help() 函式用於檢視函式或模組用途的詳細說明。

print(help(student))

執行結果對比

元類建立類

class

person

(object):

pass

def__init__

(self):

pass

@classmethod

deftest_cls_func

(cls):

pass

@staticmethod

deftest_static_func

():pass

student = type(

"student", # 類名

(person,), # 所有的父類,使用元組傳參

# 類包含的屬性

)print(help(student))

# 執行結果

#

執行結果

注意:

class

person

(object):

pass

# student 只是乙個變數,引用了type 返回的student型別

student = type("student", (person,), )

student = student()

# student2 只是乙個變數,引用了type 返回的student型別

student2 = type("student", (person,), )

student2 = student2()

print(type(student))

print(type(student2))

# 執行結果

# #

元類改造類

元類除了能建立乙個類,也能改造乙個類.

class

changeclass

(type):

# 這個必須是type子類

def__new__

(cls, class_name, super_names, attrs):

print("class_name: %s" % class_name)

print("super_names: %s" % super_names)

print("attrs: %s" % attrs)

tmp_attrs = dict()

# 將所有 例項/類/靜態 方法的名字改為小寫

for key, value in attrs.items():

# hasattr(value, "__call__") 判斷值是乙個func 物件,

# 不能使用isinstance , 因為 class function: # todo not defined in builtins!(原始碼)

if hasattr(value, "__call__") or isinstance(value, classmethod) or isinstance(value, staticmethod):

tmp_attrs[key.lower()] = value

continue

tmp_attrs[key] = value

return type.__new__(cls, class_name, super_names, tmp_attrs) # 一般工作中用這種方式

class

preson

(object, metaclass=changeclass):

cls_name = "cls_name"

def__init__

(self):

self.self_name = "self_name"

@classmethod

deftest_cls_func

(cls):

pass

print("改造後 " + "*" * 20)

print(preson.__dict__)

# 執行結果

# class_name: preson

# super_names:

# attrs:

# 改造後 ********************

#

結語

是結束亦是開始, 革命尚未成功, 同志仍需努力.

python 教程 : 廖雪峰 python 教程

菜鳥教程

到此結  dragonfangqy 2018.5.27

CUDA學習(二十四)

共享記憶體的影響 共享記憶體在多 種情況下可能會有所幫助,例如幫助合併或消除對全域性記憶體的冗餘訪問。但是,它也可以作為占用限制。在許多情況下,核心所需的共享記憶體量與所選塊的大小有關,但執行緒與共享記憶體元素的對映不需要是一對一的。例如,可能需要在核心中使用32x32元素共享記憶體陣列,但由於每塊...

Python零基礎學習筆記(二十四) 函式

認識函式 在以惡完整的專案中,某些功能會反覆的使用,那麼 會將功能封裝成函式,當我們要使用這些功能的時候 直接呼叫函式即可 本質 函式就是對功能的封裝 優點 1 簡化 結構,增加了 的復用度 重複使用的程度 2 如果想修改某些功能或修改某個bug只需要修改相應的函式即可 定義函式 格式 def 函式...

第二十四周學習筆記

自監督關鍵點檢測和特徵描述子生成 自監督訓練方法 使用全卷積神經網路架構,乙個共享的encoder對進行編碼,兩個decoder分別檢測關鍵點和生成描述子 outperform lift in almost all metrics quantitatively scores strongly in ...