元類,就是建立類的建立者,簡單來說就是**的生成器
python元類都是從type類繼承的。用元類可以做一些很麻煩的工作,如驗證子類,註冊子類等。
import json
# global dict
registry = {}
def register_class(target_class):
registry[target_class.__name__] = target_class
class serializable(object):
def __init__(self, *args):
self.args = args
def serialize(self):
return json.dumps()
class meta(type):
def __new__(meta, name, bases, class_dict):
cls = type.__new__(meta, name, bases, class_dict)
register_class(cls)
return cls
class serialize(serializable, metaclass=meta):
pass
def deserialize(data):
params = json.loads(data)
name = params['class']
target_class = registry[name]
s = target_class(*params['args'])
return s
# test class
class vec2d(serialize):
def __init__(self, x, y):
super().__init__(x,y)
self.x, self.y = x, y
def __repr__(self):
return 'vec2d(%d,%d)' % (self.x, self.y)
if __name__=='__main__':
t = vec2d(3,-12)
print('before', t)
data = t.serialize()
print("serialized:"+data)
m = deserialize(data)
print("deserialized:" , m)
結果:
before vec2d(3,-12)
serialized:
deserialized: vec2d(3,-12)
元類可以用在類定義好,未使用時,修改類的屬性,與描述符搭配起來,更方便。
class fild(object):
'''資料庫中的列
'''def __init__(self):
self.name = none
self.internal_name = none
def __get__(self, instance, owner):
if instance is none:
return self
return getattr(instance, self.internal_name, "")
def __set__(self, instance, value):
setattr(instance, self.internal_name, value)
class meta(type):
def __new__(meta, name, bases, class_dict):
for key,value in class_dict.items():
if isinstance(value, fild):
value.name = key
value.internal_name = "_" + key
cls = type.__new__(meta, name, bases, class_dict)
return cls
class databaserow(object, metaclass=meta):
'''構造一系列有相同結構的屬性值
'''pass
class customer(databaserow):
first_name = fild()
last_name = fild()
if __name__=='__main__':
foo = customer()
print('befor:', repr(foo.first_name), foo.__dict__)
foo.first_name = 'killer'
print('after:', repr(foo.first_name), foo.__dict__)
結果:
befor: '' {}
after: 'killer'
參考:
my coding.net
python的學習(十八)—- 單元測試工具nose
python 元類 python元類深入理解
1.python 中的類 在python中,類也是乙個物件,只不過這個物件擁有生成例項的能力,我們一般使用class 來定義乙個類,在python直譯器執行到這個地方的時候會自動建立出這個物件,python也為我們提供了手動建立類的方法,type type 這個方法對我們來說並不陌生,我們所熟知的用...
python元類的使用 Python的元類如何使用
這次給大家帶來python的元類如何使用,使用python元類的注意事項有哪些,下面就是實戰案例,一起來看一下。今天我的任務就是徹底明白什麼是元類,一起看看。要搞懂元類,我們還是先從物件說起。python 一切皆物件,這句話你一定有聽說過 現在你就聽說了 乙個數字是物件,乙個字串是物件,乙個列表是物...
python 元類程式設計 python的元類程式設計
一 property動態屬性 給類中的乙個方法函式加上 property裝飾器,將這個方法變成屬性描述符,將獲取方法變為獲取屬性。class user def init self,name,birthday self.name name self.birthday birthday property...