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

问题描述 投票:0回答:6

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

这里写了如何声明一个方法: Python 中的静态方法?

python class static attributes
6个回答
100
投票

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)

您的类中可以有两个不同的同名变量(一个静态变量和一个普通变量)。 别混淆了。


21
投票

补充一下,函数中也可以有静态变量,而不仅仅是类:

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  

13
投票

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

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)。

有关此约定及其含义的更多详细信息,请参阅官方文档的快速摘录:

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

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


2
投票

静态属性是Python中的数据属性。 这样在类中分配的属性:-

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

>>>A.a
>>>1

这与 C++ 和 Java 不同,在 C++ 和 Java 中,无法使用实例访问静态成员:-

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

还有内置方法

setattr
将帮助您设置
static variable(data attribute)

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

0
投票

对于那些来这里使用

setattr
作为向类添加静态方法的方法的人来说,您需要
staticmethod
函数。

def func_c():
    return 1

class A:
    pass

setattr(A, 'f', staticmethod(func_c))
a_instance = A()
a_instance.f()

基本原理

如果是你的类,这样写比较容易:

class A:
    @staticmethod
    def func_c():
    return 1

但是,情况并非总是如此。

由于传递函数时默认 setattr 更改为

classmethod
,这将抛出
TypeError: func_c() takes 0 positional arguments but 1 was given

def func_c():
    return 1

class A:
    pass

setattr(A, 'f', func_c)
a_instance = A()
a_instance.f()

-6
投票

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

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

a = A()
print a.a

1

a.a = 2

AttributeError: can't set attribute
© www.soinside.com 2019 - 2024. All rights reserved.