python 元類註冊

2021-08-28 01:20:27 字數 2615 閱讀 8697

元類,就是建立類的建立者,簡單來說就是**的生成器

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