2016-07-15 90 views
1

我有它創建了一個子類的成員對象的構造:蟒對象的成員變量缺少

class OpenSprinkler: 
    class CV: 
    my_args = ['rsn', 'rbt', 'en', 'rd', 're'] 
    my_longhand = {'reset_all':'rsn', 
        'reboot':'rbt', 
        'enable':'en', 
        'rain_delay':'rd', 
        'remote_extension':'re'} 

    def __init__(self, p): 
     print('set parent of %r\n' % (self,)) 
     self.parent = p 
     print('parent set to %r\n' % (p,)) 
     self.my_args.extend(self.my_longhand.keys()) 

    def __init__(self, hostname, password, log=None): 
    self.cv = self.CV(self) 

輸出確認,對於構件的構造被稱爲:

>>> c = openSprinkler.OpenSprinkler('foo','bar') 
set parent of <openSprinkler.OpenSprinkler.CV object at 0xb6a58df0> 

parent set to <openSprinkler.OpenSprinkler object at 0xb6a58dd0> 

>>> repr(c.cv) 
'<openSprinkler.OpenSprinkler.CV object at 0xb6a58df0>' 

但當我在看的成員,cv.parent似乎並不存在:

>>> dir(c.cv) 
['__class__', '__delattr__', '__dict__', '__dir__', '__doc__', '__eq__', '__format__', '__ge__', '__getattribute__', '__gt__', '__hash__', '__init__', '__le__', '__lt__', '__module__', '__ne__', '__new__', '__reduce__', '__reduce_ex__', '__repr__', '__setattr__', '__sizeof__', '__str__', '__subclasshook__', '__weakref__', 'my_args', 'my_longhand'] 

cv.my_args包含擴展列表。任何想法這裏發生了什麼?

更新: 正如亞歷克指出的那樣,代碼示例實際上工作正常。 實際問題已從示例中省略,並且我選擇覆蓋setattr方法,但不允許設置父級。

最初:

def __setattr__(self, name, value): 
    if name in self.my_args: 
    if name in self.my_longhand.keys(): 
     name = self.my_longhand[name] 
    self.parent._json_get('cv', {name:value}) 

現在:

def __setattr__(self, name, value): 
    if name in self.my_args: 
    if name in self.my_longhand.keys(): 
     name = self.my_longhand[name] 
    self.parent._json_get('cv', {name:value}) 
    else: 
    super().__setattr__(name, value) 

回答

0

有沒有可能是你有一個openSprinkler對象中某處代碼被呼叫?實例化OpenSprinkler直接似乎包含了你的方法:

c = OpenSprinkler('foo','bar') 

print(dir(c.cv)) 
# ['__class__', '__delattr__', '__dict__', '__dir__', 
# '__doc__', '__eq__', '__format__', '__ge__', '__getattribute__', 
# '__gt__', '__hash__', '__init__', '__le__', '__lt__', 
# '__module__', '__ne__', '__new__', '__reduce__', '__reduce_ex__', 
# '__repr__', '__setattr__', '__sizeof__', '__str__', 
# '__subclasshook__', '__weakref__', 'my_args', 'my_longhand', 'parent'] 
+0

你是對的,它實際上是因爲我已經覆蓋了__setattr__忘了允許設置父。哎呀 – devanl