【问题标题】:How to declare a static attribute in Python?如何在 Python 中声明静态属性?
【发布时间】:2015-02-13 09:01:39
【问题描述】:

如何在 Python 中声明静态属性?

这里写了我如何声明一个方法: Static methods in Python?

【问题讨论】:

  • 你到底在说什么“静态”?定义因语言而异。甚至使用相同的语言,具体取决于它的声明位置(例如在 C/C++ 中,文件级别的静态,函数级别的静态或类级别的静态,3 种完全不同的东西......)
  • 我有一个类,我希望所有对象默认都具有静态属性。在 C++ 中,您可以编写:static int statischeVariable=5;

标签: python class static attributes


【解决方案1】:

在 Python 中在类级别定义的所有变量都被认为是静态的

class Example:
    Variable = 2           # static variable

print Example.Variable     # prints 2   (static variable)

# Access through an instance
instance = Example()
print instance.Variable    # still 2  (ordinary variable)


# Change within an instance 
instance.Variable = 3      #(ordinary variable)
print instance.Variable    # 3   (ordinary variable)
print Example.Variable     # 2   (static variable)


# Change through Class 
Example.Variable = 5       #(static variable)
print instance.Variable    # 3  (ordinary variable)
print Example.Variable     # 5  (static variable)

你的类中可以有两个不同的变量在同一个名字下(一个是静态的,一个是普通的)。 不要混淆。

【讨论】:

  • 这是一个类变量,具有不同的行为,例如@staticmethod。我看到的唯一正确识别类属性和静态属性之间差异的答案是被否决的答案(!)
【解决方案2】:

补充一点,你也可以在函数中使用静态变量,而不仅仅是类:

def some_fun():
    some_fun.i += 1
    print(some_fun.i)

some_fun.i = 0;
print(some_fun(), some_fun(), some_fun())  
# prints: 1,2,3  

【讨论】:

    【解决方案3】:

    类主体内声明的所有变量都是“静态”属性。

    class SomeClass:
        # this is a class attribute
        some_attr = 1
    
        def __init__(self):
            # this is an instance attribute
            self.new_attr = 2
    

    但请记住,“静态”部分是按照惯例,而不是强加的(有关此内容的更多详细信息,请阅读 this SO thread)。

    有关此约定及其含义的更多详细信息,请参阅official documentation 的简短摘录:

    “私有”实例变量,除了从 在对象内部,在 Python 中不存在。然而,有一个 大多数 Python 代码遵循的约定:名称以 下划线(例如 _spam)应被视为非公开部分 API(无论是函数、方法还是数据成员)。它 应被视为实施细节并可能发生变化 恕不另行通知。

    由于类私有成员有一个有效的用例(即 避免名称与子类定义的名称发生名称冲突),有 对这种机制的支持有限,称为名称修改。任何 __spam 形式的标识符(至少两个前导下划线,在 大多数尾随下划线)在文本上替换为 _classname__spam,其中 classname 是去掉前导下划线的当前类名。这种修改是不加考虑的 到标识符的句法位置,只要它出现 在类的定义中。

    【讨论】:

      【解决方案4】:

      python 中的静态属性是data attributes。 这样在类中分配的属性:-

      >>>class A(object):
      >>>    a = 1
      
      >>>A.a
      >>>1
      

      这与 C++ 和 Java 不同,后者不能使用实例访问静态成员:-

      >>>inst  = A()
      >>>inst.a
      1
      >>> 
      

      还有内置方法setattr会帮你设置static variable(data attribute)

      >>>setattr(A, 'b', 2)
      >>>A.b
      >>>inst.b
      

      【讨论】:

      • “这与 C++ 和 Java 不同,在 C++ 和 Java 中,不能使用实例访问静态成员”这句话是完全错误的。有关示例,请参阅ideone.com/ndh37g。我认为您可能不小心切换了语句中的顺序,因为“在 C++ 和 Java 中,不能使用类访问实例成员”的反面是正确的。
      【解决方案5】:

      您可以使用标准的@property 装饰器来制作静态属性:

      class A(object):
          @property
          def a(self):
              return 1
      
      a = A()
      print a.a
      
      1
      
      a.a = 2
      
      AttributeError: can't set attribute
      

      【讨论】:

      • 你所做的不是静态属性,而是常量/只读属性。
      猜你喜欢
      • 1970-01-01
      • 2017-07-06
      • 2016-10-06
      • 2011-10-24
      • 1970-01-01
      • 2015-02-24
      • 2017-03-23
      • 2018-05-01
      • 1970-01-01
      相关资源
      最近更新 更多