python 元類與資料描述符

2021-09-11 20:59:59 字數 2417 閱讀 5218

學習完了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 中的其中任意一種方法的類稱之為描述符,描述符的本質是新式類,並且被 的類 即應用...