代码之家  ›  专栏  ›  技术社区  ›  user225312

非实例类属性

  •  1
  • user225312  · 技术社区  · 16 年前

    您好,我需要一个非实例类属性,我正在执行以下操作:

    >>> class X:
    ...     def __init__(self, y=None):
    ...             self.y = list()
    

    这样行吗?如果没有,还有别的办法吗?我无法在中实例化此属性 __init__ 因为我以后会附加这个。

    4 回复  |  直到 16 年前
        1
  •  4
  •   Sam Dolan    16 年前

    定义 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的一个实例。当我们添加到 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 .

        2
  •  2
  •   Anurag Uniyal    16 年前

    如果需要一个初始的空属性,稍后将向其添加项,只需执行此操作。

    class X(object):
        def __init__(self):
            self.y = []
    

    这里有几点需要注意(与您的版本不同)

    • 从派生类 object
    • y = list() 一样 y = [] 最好是。
    • 不需要有默认参数 y=None ,当您不使用它时
        3
  •  2
  •   ebt    16 年前

    添加到其他语句中: 有类变量和实例变量,它们是独立的,不能以相同的方式访问。 前任:

    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'
    
        4
  •  0
  •   Boris Gorelik    16 年前

    让我把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 = []