學習完了python中元類程式設計與資料描述符一章節,寫乙個demo記錄學習成果。下面是乙個簡單的orm模型。資料描述符還算是可以理解。就元類傳遞引數有__init__,new__以及__prepare。理解**首先了解基本原理:
__new__方法的返回值就是類的例項物件,這個例項物件會傳遞給init方法中定義的 self 引數,以便例項物件可以被正確地初始化。可以知道本例中如何使用type.__new__方法建立user物件的,filed = type('filed', (object,), {})
。
元類基本作用:攔截類的建立,修改類,返回修改之後的類
也可以使用super().init(name, bases, dic)代替super().new(cls, name, bases, dic)。
class mymetaclass(type):
def __new__(cls, name, bases, dic):
if name == 'basemodule':
return super().__new__(cls, name, bases, dic)
fileds = {}
for key , value in dic.items():
if isinstance(value, filed):
fileds.update()
meta_name = dic.get('meta', none)
if meta_name is not none:
db_table = getattr(meta_name, 'db_table')
else:
db_table = name.lower()
dic['db_table'] = db_table
dic['fileds'] = fileds
return super().__new__(cls, name, bases, dic)
filed = type('filed', (object,), {})
class intfiled(filed):
def __init__(self, name, max, min):
self.storage_name = name
self.max = max
self.min = min
def __get__(self, instance, owner):
return instance.__dict__[self.storage_name]
def __set__(self, instance, value):
if not isinstance(value, int):
raise typeerror('value must be int')
if not(value > self.max or value < self.min):
raise typeerror('value must be in range {} and {}'.format(self.min, self.max))
instance.__dict__[self.storage_name] = value
class basemodule(metaclass=mymetaclass):
def __init__(self,**kwargs):
# for key, value in kwargs.items():
# setattr(self, key, value)
super().__init__()
class user(basemodule):
age = intfiled('age', 1, 100)
class meta:
db_table = 'user'
user = user(age =20)
user.age = 10
print(user.age)
元類的單例模式:
class singleton(type):
def __call__(cls, *args, **kwargs):
if not hasattr(cls, '_instance'):
cls._instance = super(singleton, cls).__call__(*args, **kwargs)
return cls._instance
class foo(metaclass=singleton):
pass
foo1 = foo()
foo2 = foo()
print(id(foo1))
print(id(foo2))
python 描述 python描述符
在python中,訪問乙個屬性的優先順序順序按照如下順序 1.類屬性2.資料描述符3.例項屬性4.非資料描述符5.getattr 方法。描述符,用一句話來說,就是將某種特殊型別的類的例項指派給另乙個類的屬性 注意 這裡是類屬性,而不是物件屬性 而這種特殊型別的類就是實現了 get set delet...
python3使用元類和資料描述符實現ORM
coding utf 8 author pengj time 2019 1 5 16 40 file myorm.py import numbers class field pass class charfield field 資料描述符 好處在於可以在各方法中校驗傳入值的合理性 def init ...
python 描述符基本
相關資料 python的描述符 下一站,我等你 描述符的本質類 python為開發者提供了乙個非常強大的功能 描述符。那什麼是描述符呢?通過檢視python的官方文件,我們知道把實現了 get set 和 delete 中的其中任意一種方法的類稱之為描述符,描述符的本質是新式類,並且被 的類 即應用...