如果我在__init__时没有可用的所有实例变量值,我可以创建一个对象吗?

时间:2017-09-21 01:02:11

标签: python python-3.x

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赋值?处理这个问题最安全的方法是什么?

1 个答案:

答案 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

但所有提出的做法的方法都涉及默认值,在这里任意''