蟒蛇.定义"属性初始方法"

Pol*_*Pol 2 python

我有:

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和属性valueB实例必须有什么价值,在类的实例的新属性集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)

Dan*_*olo 5

只是巧妙地覆盖__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)