您好我需要一个未实例化的类属性,我这样做:
>>> class X:
... def __init__(self, y=None):
... self.y = list()
这可以吗?如果不是,还有另一种方法吗?我无法在__init__
中实例化此属性,因为我稍后会附加此属性。
答案 0 :(得分:4)
在类级属性上定义y
var。你需要将它初始化为某个东西,即使它是一个空列表(正如你之前所做的那样)。
>>> 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的实例。当我们添加到y
实例中的z
变量时,我们仍然追加到类变量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。
答案 1 :(得分:2)
如果您需要一个初始的空属性,稍后您将添加项目,只需执行此操作
class X(object):
def __init__(self):
self.y = []
这里有很多事情需要注意(与您的版本不同)
object
y = list()
与y = []
相同,是首选。y=None
答案 2 :(得分:2)
添加到其他语句: 有类变量和实例变量,它们是分开的,不能以相同的方式访问。 例如:
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'
答案 3 :(得分:0)
让我逐步解释Anurag 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 = []