我有一个名为MyClass的类:
def __init__(self, config):
self.response = Response(config)
self.utility = Utility()
self.listl = {}
其方法如下:
def findSt(self, lv):
dvp = self.listl
if lv not in dvp:
raise Exception("ERROR: ....", lv)
else:
...
在我的主代码中,我使用同一类的另一个方法(getvalues)为self.listl ie提供正确的值:
myobject = MyClass(config)
myobject.listl = myobject.getvalues()
lr = []
for lv in lvs:
lr.append(myobject.findSt(lv))
这是可行的,尽管我不确定这是正确的方法。我之所以这么问是因为如果我在主代码中输入了以下错误:
myobject.listL = myobject.getvalues()
没有引发错误!当然,在这种情况下myobject.listl
没有正确的运行时值,所以它不起作用,但是为什么我可以创建一个不在__init__
中的变量呢
用户定义的类实例可以在运行时添加/删除属性:
虽然内置类型通常不允许这样做:
在python中,每个对象都有一个包含其属性的关联字典:
__dict__
。这本词典是可变的。执行任务时:实际发生的情况是,您正在为对象的
__dict__
赋值:事实上:
^{} 在这方面并不特别。这只是一个约定所有的属性都在那里定义,但是当你把
self.attribute = value
放在__init__
里面时,你做的事情和上面的代码完全一样:创建一个新的属性。 这是大多数时候进行初始化的正确方法类不(通常)声明其实例的预定义属性集。使用某些元编程可以添加此类声明(例如,使用类修饰符/元类)
如果要提前定义类的属性,可以使用^{} :
在类中定义
__slots__
时,它的实例没有关联的__dict__
,因此无法在运行时添加属性或者,您可以重新定义^{} 方法,以便更好地控制设置属性时发生的事情
因为同样的原因,你可以设置
myobject.listl
你可以从任何地方设置任何实例上的任何属性*,__init__
中设置的属性在任何方面都不是特别的。__init__
唯一的特别之处在于,当创建新实例时,它会自动调用这并不意味着你必须利用它,通常最好不要从类外设置这样的属性,我更喜欢有这样的方法
差不多吧。一般来说,您需要小心,因为您有一个可变的属性,如果一些外部代码仍然持有对旧self.listl的引用呢?那么旧的列表就不会被那个代码改变了。这样就可以:
不会重新设置listl属性,而只是其中的值。但那是完全不同的讨论
*:有一些异常,比如用C实现的类,或者定义了
__slots__
的类,但是这些异常很少相关问题 更多 >
编程相关推荐