如果在初始化时没有所有实例变量值可用,是否可以创建一个对象?

2024-09-29 23:24:55 发布

您现在位置:Python中文网/ 问答频道 /正文

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


Tags: 对象实例方法代码selfreturninitdef
1条回答
网友
1楼 · 发布于 2024-09-29 23:24:55

Can I create an object if I don't have all instance variables values available at init time?

是的,你可以。怎样?正如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


另一种策略可能是创建一个属性atribute,它实际从缓存的值中获取元素,如下所示
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

但是你所说的所有建议的方法都包含一个默认值,在这里任意''。你知道吗

相关问题 更多 >

    热门问题