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

如何在Python中声明静态属性?,python,class,static,attributes,Python,Class,Static,Attributes,如何在Python中声明静态属性 下面是如何声明方法的说明: 类主体内声明的所有变量都是“静态”属性 class SomeClass: # this is a class attribute some_attr = 1 def __init__(self): # this is an instance attribute self.new_attr = 2 但请记住,“静态”部分是按惯例而不是强制执行的(有关此部分的更多详细信息,请阅读

如何在Python中声明静态属性

下面是如何声明方法的说明:

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

class SomeClass:
    # this is a class attribute
    some_attr = 1

    def __init__(self):
        # this is an instance attribute
        self.new_attr = 2
但请记住,“静态”部分是按惯例而不是强制执行的(有关此部分的更多详细信息,请阅读)

有关本公约及其影响的更多详细信息,请参阅以下内容:

无法访问的“私有”实例变量,除非从 在对象内部,Python中不存在。然而,有一个问题 大多数Python代码遵循的约定:名称前缀为 下划线(如_垃圾邮件)应视为邮件的非公开部分 API(无论是函数、方法还是数据成员)。信息技术 应被视为实施细节,并可能发生变化 没有通知

因为类私有成员有一个有效的用例(即 避免名称与子类定义的名称发生名称冲突) 对这种机制的支持是有限的,称为名称混乱。任何 垃圾邮件格式的标识符(至少两个前导下划线,至少 大多数尾随下划线)在文本上替换为 _classname\uuu spam,其中classname是带前导下划线的当前类名。这种弄脏是不加考虑的 标识符的语法位置,只要它出现 在类的定义中

静态属性是用python编写的。 以便在类中指定属性:-

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

>>>A.a
>>>1

这与C++和java不同,其中静态成员不能使用实例:-< /p>访问。

>>>inst  = A()
>>>inst.a
1
>>> 
另外,内置方法
setattr
将帮助您设置
静态变量(数据属性)


此外,您还可以在函数中使用静态变量,而不仅仅是类:

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  

您可以使用标准@property decorator创建静态属性:

class A(object):
    @property
    def a(self):
        return 1

a = A()
print a.a

1

a.a = 2

AttributeError: can't set attribute

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)
类中可以有两个同名的不同变量(一个静态变量和一个普通变量)。
别糊涂了

你所做的不是一个静态属性,而是一个常量/只读属性。你到底把“静态”称为什么?不同语言的定义大不相同。即使在同一种语言中,根据声明的位置(如在C/C++、文件级静态、函数级静态或类级静态,3个完全不同的东西…)我有一个类,我希望所有对象在默认情况下都有一个静态属性。在C++中,你可以写:<代码>静态int StaysChaveReable=5;<代码>语句“这与C++和java不同,其中静态成员不能使用实例访问”是完全错误的。有关示例,请参见。我认为您可能无意中在语句中切换了顺序,因为“C++和java和实例成员不能使用类访问”的相反是真实的。这是类变量,并且行为不同于例如“代码> @ StistalPosith< /Cord>”。我看到的唯一正确识别类属性和staticattributes之间差异的答案是被否决的(!)
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)