未初始化类属性
你好,我需要一个非实例类属性,我这样做:未初始化类属性
>>> class X:
... def __init__(self, y=None):
... self.y = list()
这是好吗?如果不是,是否有另一种方法。我不能在__init__
中实例化这个属性,因为我会在后面追加这个属性。
定义的类级属性y
变种。你需要将它初始化为某种东西,即使它是一个空的列表(就像你之前做的那样)。
>>> class X:
... y = []
... def __init__(self):
... pass
更新根据您的意见:
你提到涨跌互现的术语(我的类和实例变量之间的假设),所以这里的,如果你使用后会发生什么类(可能不是你想要的)。
>>> class X:
... y = [] # Class level attribute
... def __init__(self):
... pass
...
>>> x = X()
>>> x.y.append(1)
>>> x.y
[1]
>>> x.y.append(2)
>>> z = X()
>>> z.y.append(3)
>>> z.y
[1, 2, 3]
>>> X.y.append(4)
>>> [1, 2, 3, 4]
请注意,当您向类中添加一个变量时,它会在各个构造之间延伸。在前面的代码中,我们将变量x
和变量z
作为X的实例进行了实例化。虽然我们在z
实例中添加了y
变量,但我们仍附加到类变量y
。请注意最后一行(X.y.append(4)
)我使用对类X
的引用追加了一个项目。
你可能想要的是基于关闭您的原贴:
>>> class X:
... def __init__(self, y=None):
... self.y = y or list() # Instance level attribute. Default to empty list if y is not passed in.
...
>>> x = X()
>>> x.y.append(1)
>>> x.y
[1]
>>> z = X()
>>> z.y.append(2)
>>> z.y
[2]
>>>
>>> s = X()
>>> s.y
[]
>>> t = X(y=[10])
>>> t.y
[10]
注意到一个新的列表是如何与每个实例创建。当我们创建一个新实例z
并尝试附加到y
变量时,我们只会获取附加的值,而不是将所有现有的添加项都保留在列表中。在最后一个实例(t
)中,例如,构造函数在其构造中传入参数y
,因此具有列表[10]
,因为它的实例变量为y
。
希望有帮助。随意问任何更多的不确定性作为意见。另外,我建议阅读Python类文档here。
我的做法有什么问题? :) – user225312 2010-07-07 06:10:00
你说“class属性”,所以这就是我所做的。如果你想坚持原来的基于实例的方式,我会将代码改为'self.y = y或者list()',如果这样的话,如果有人通过了'y',那么它会被使用,否则你会创建一个空的清单。 – sdolan 2010-07-07 06:19:57
感谢和抱歉搞乱术语。 – user225312 2010-07-07 06:22:03
如果你需要一个初始为空的属性,以稍后您将添加项目,只是这样做
class X(object):
def __init__(self):
self.y = []
几件事情,这里要注意(从您的版本差异)
- 派生从类
object
-
y = list()
与y = []
相同并且是优选的。 - 不需要有默认参数
y=None
的,当你不使用它
但没有明确指定:'def __init __(self,y)'使它更好? – user225312 2010-07-07 06:10:32
@PulpFiction:否。除非构造函数实际使用参数,否则参数不应该在那里。 – 2010-07-07 06:34:57
@David:那么使用y = None是不好的做法? – user225312 2010-07-07 06:43:28
要添加到其他语句: 有类变量和实例变量,它们是分开的,不能以相同的方式访问。 例如:
class foo:
x=[]
def __init__(self):
self.y=[]
foo.x.append(20)
f = foo()
f.y.append(30)
print f.y
print foo.x
print f.x
print foo.y
#results-------------------------------
[30]
[20]
[20]
Traceback (most recent call last):
File "C:\Users\adminuser\Desktop\temp.py", line 12, in <module>
print foo.y
AttributeError: class foo has no attribute 'y'
那么'x = []' - 类变量是什么?对不起,但试图了解这里的术语。 – user225312 2010-07-07 06:25:12
@PulpFiction:是的,x是一个类属性,并在该类的所有实例之间共享。您也可以在不创建实例的情况下访问它。 y是对象属性,并为每个类的实例创建一个新对象。 – 2010-07-07 06:39:24
让我的程度阿努拉格Uniyal的答案有点
class X(object):
def __init__(self, y=None):
if y is None:
# y wasn't specified, create an empty list
self.y = []
else:
# y was specified, use it
try:
self.y = list(y) #create y's copy so that the original
# variable is safe
except TypeError:
# ooops, couldn't create a list. We might warn
# the user or something. Oh, nevermind
self.y = []
什么叫“未初始化类属性”是什么意思?你已经实例化了一个列表 – 2010-07-07 05:49:50
*我不能在'__init__' *中实例化这个属性,但这就是你正在做的....我不明白你的问题。 – 2010-07-07 05:49:55
这是实例化它的正确方法吗? – user225312 2010-07-07 05:52:40