Nonify場我有一個任務:實施特殊的元類。在繼承
貫徹元類「ModelCreator」,即允許聲明類 字段的格式如下:
class Student(object): __metaclass__ = ModelCreator name = StringField()
凡
StringField
- 一些對象表示,這個字段是 文本字段。所以必須有一個類,它的構造函數接收相應的屬性( 類型檢查和鑄造) 命名參數「名稱」,並將其存儲所以,你可以輸入這樣的事情:
s = Student(name = 'abc') print s.name
的類應該允許繼承,應該驗證類型, 方式,你不能寫一個數字文本字段。
這是我實現,但有一個與繼承類它的問題「名稱」字段是不是空的(因爲我希望它是)它臨危從以前的類名稱值。
class StringField(object):
def __init__(self, my_type, default=None):
self.type = my_type
self.name = None
if default:
self.default = default
else:
self.default = my_type()
def __set__(self, instance, value):
if isinstance(value, self.type):
setattr(instance, self.name, value)
else:
raise TypeError("value must be type of {}".format(self.type))
def __get__(self, instance, owner):
return getattr(instance, self.name, self.default)
def __del__(self):
raise AttributeError("you can`t remove this attribute {}".format(self.name))
class ModelCreator(type):
def __new__(mcs, name, bases, diction):
socket = []
for key, value in diction.iteritems():
if isinstance(value, StringField):
value.name = "_{}".format(key)
socket.append(value.name)
def new(cls, *args, **kwargs):
for names in kwargs:
if '_{}'.format(names) in diction['__slots__']:
if isinstance(kwargs[names], diction[names].type):
diction[names].default = kwargs[names]
else:
raise TypeError('attr has other type')
return type(name, bases, diction)
diction["__slots__"] = socket
diction["__new__"] = new
return super(ModelCreator, mcs).__new__(mcs, name, bases, diction)
class Student(object):
__metaclass__ = ModelCreator
name = StringField(str)
class School(Student):
second_name = StringField(str)
def main():
st = Student(name = "Hello")
print st.name
st.name = "Vlad"
sc = School(second_name = "World")
print sc.second_name, sc.name
if __name__ == '__main__':
main()
此代碼打印
你好
世界你好
但應(按任務)打印
你好
個
世界無
的問題是:
爲什麼類型(ST)的回報 「型 '型'?」 (我認爲這是不實例類) 爲什麼類型(SC)的回報「類‘主要 .ModelCreator’」?
如何Nonify「名稱」字段的值,在「學生」類,所以(因爲它現在在某種程度上,即使在「SC」載),它只會被保存在「ST」?