__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 ...