Python3
class testObj:
def __init__(self, val1, val2):
self.val1 = val1
self.val2 = val2
def __repr__(self):
return self.val1) + "," + self.val2
我的实际代码有几个类变量(12),并且对我已创建的对象列表中存在的数据执行了许多计算。我发现自己需要在类val3
中添加另一个变量,这在对象实例化时是未知的。
有没有办法将val3
添加到testObj
类,但是在实例化对象时不为它传递值,并稍后为val3
赋值?处理这个问题最安全的方法是什么?
答案 0 :(得分:1)
如果我没有在 init 时间提供所有实例变量值,我可以创建一个对象吗?
是的,你可以。怎么样 ?正如Kyle和user2357112所说,这不是一个可取的设计,但我想,鉴于您已经展示了您可能想要的代码
class testObj:
def __init__(self, val1, val2):
self.val1 = val1
self.val2 = val2
def __repr__(self):
return self.val1 + "," + self.val2 + "," + getattr(self, 'val3', '') #<----------
根据您真正想要做的事情,可能会采用最安全的方式调用val3
。
>>> tobj = testObj('a','b')
>>> print(tobj)
a,b,
>>> tobj.val3 = 'c'
>>> print(tobj)
a,b,c
<小时/> 另一种策略可能是创建一个属性属性,该属性实际上从缓存值中获取元素,如下所示
class testObj:
def __init__(self, val1, val2):
self.val1 = val1
self.val2 = val2
self._cache = {} #<----------
def __repr__(self):
return self.val1 + "," + self.val2 + "," + self.val3
@property
def val3(self):
return self._cache.get('val3', '') #<----------
哪会导致使用它如下
>>> tobj = testObj('a','b')
>>> print(tobj)
a,b,
>>> tobj._cache['val3'] = 'c'
>>> print(tobj)
a,b,c
<小时/> 保罗提到的另一个策略是
class testObj:
def __init__(self, val1, val2):
self.val1 = val1
self.val2 = val2
self._val3 = '' #<----------
def __repr__(self):
return self.val1 + "," + self.val2 + "," + self.val3
@property
def val3(self):
return self._val3
@val3.setter #<----------
def val3(self, value):
self._val3 = value
用例
>>> tobj = testObj('a','b')
>>> print(tobj)
a,b,
>>> tobj.val3 = 'c'
>>> print(tobj)
a,b,c
但所有提出的做法的方法都涉及默认值,在这里任意''
。