1
I가 서브 클래스의 멤버 객체를 생성하는 생성자 : 부재의 생성자가 호출되었는지파이썬 객체 멤버 변수
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
에는 확장 목록이 포함되어 있습니다. 무슨 일이 벌어지고 있는거야?
업데이트 : Alec이 지적했듯이 코드 예제는 실제로 작동합니다. 실제 문제는 예제에서 생략되었으며 부모 설정을 허용하지 않고 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)
당신 말이 맞아, 그것은 내가 __setattr__을 무시하고 부모를 설정 할 수 깜빡했기 때문에 사실입니다. 어머나 – devanl