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”?