我有:
class C:
aaa=2
class B:
def __init__ (self,name):
self.name
self.value
Run Code Online (Sandbox Code Playgroud)
我如何定义类,C所以当我动态地将属性设置为实例时,它会创建类的属性实例B.和属性类的名称B必须具有属性name的类,新属性的名称相同字符串C和属性value的B实例必须有什么价值,在类的实例的新属性集C.
必须给我这个结果:
>> c=C()
>> c.whatever= 'strinstrinsstring'
>> isinstance(c.whatever,B)
True
>> c.whatever.value
'strinstrinsstring'
>>c.whatever.name
'whatever'
Run Code Online (Sandbox Code Playgroud)
只是巧妙地覆盖__setattr__.如果您只想为特定属性执行此操作,请为要查找的属性名称添加特殊情况:
>>> class B:
def __init__(self, name, value):
self.name = name
self.value = value
>>> class C:
def __setattr__(self, name, value):
if name == 'makeMeB':
newb = B(name, value)
self.__dict__[name] = newb
else:
self.__dict__[name] = value
>>> c = C()
>>> c.makeMeB = 'foo'
>>> isinstance(c.makeMeB, B)
True
>>> c.makeMeB.name
'makeMeB'
>>> c.makeMeB.value
'foo'
>>> c.blah = 'foo'
>>> isinstance(c.blah, B)
False
Run Code Online (Sandbox Code Playgroud)
如果你想要它的每一个属性,只要忘记它if,它会为一切做到这一点:
>>> class B:
def __init__(self, name, value):
self.name = name
self.value = value
>>> class C:
def __setattr__(self, name, value):
attr_as_b = B(name, value)
self.__dict__[name] = attr_as_b
>>> c = C()
>>> c.makeMeB = 'foo'
>>> isinstance(c.makeMeB, B)
True
>>> c.makeMeB.name
'makeMeB'
>>> c.makeMeB.value
'foo'
>>> c.amIalsoB = 'well?'
>>> isinstance(c.amIalsoB, B)
True
>>> c.amIalsoB.name
'amIalsoB'
>>> c.amIalsoB.value
'well?'
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
268 次 |
| 最近记录: |