Python中是否可以有静态类变量或方法? 为此需要什么语法?


#1楼

我发现最好的方法是使用另一个类。 您可以创建一个对象,然后在其他对象上使用它。

class staticFlag:def __init__(self):self.__success = Falsedef isSuccess(self):return self.__successdef succeed(self):self.__success = Trueclass tryIt:def __init__(self, staticFlag):self.isSuccess = staticFlag.isSuccessself.succeed = staticFlag.succeedtryArr = []
flag = staticFlag()
for i in range(10):tryArr.append(tryIt(flag))if i == 5:tryArr[i].succeed()print tryArr[i].isSuccess()

在上面的示例中,我创建了一个名为staticFlag的类。

此类应显示静态var __success (私有静态Var)。

tryIt类表示我们需要使用的常规类。

现在,我为一个标志( staticFlag )创建了一个对象。 该标志将作为对所有常规对象的引用发送。

所有这些对象都将添加到tryArr列表中。


该脚本结果:

False
False
False
False
False
True
True
True
True
True

#2楼

当在任何成员方法之外定义某个成员变量时,该变量可以是静态的也可以是非静态的,具体取决于变量的表示方式。

  • CLASSNAME.var是静态变量
  • INSTANCENAME.var不是静态变量。
  • 类中的self.var不是静态变量。
  • 类成员函数内部的var未定义。

例如:

#!/usr/bin/pythonclass A:var=1def printvar(self):print "self.var is %d" % self.varprint "A.var is %d" % A.vara = A()a.var = 2a.printvar()A.var = 3a.printvar()

结果是

self.var is 2
A.var is 1
self.var is 2
A.var is 3

#3楼

关于此答案 ,对于常量静态变量,可以使用描述符。 这是一个例子:

class ConstantAttribute(object):'''You can initialize my value but not change it.'''def __init__(self, value):self.value = valuedef __get__(self, obj, type=None):return self.valuedef __set__(self, obj, val):passclass Demo(object):x = ConstantAttribute(10)class SubDemo(Demo):x = 10demo = Demo()
subdemo = SubDemo()
# should not change
demo.x = 100
# should change
subdemo.x = 100
print "small demo", demo.x
print "small subdemo", subdemo.x
print "big demo", Demo.x
print "big subdemo", SubDemo.x

导致 ...

small demo 10
small subdemo 100
big demo 10
big subdemo 10

如果忽略悄悄设定值(您可以随时抛出异常pass上图)是不是你的事。 如果要查找C ++ Java样式静态类变量:

class StaticAttribute(object):def __init__(self, value):self.value = valuedef __get__(self, obj, type=None):return self.valuedef __set__(self, obj, val):self.value = val

请查看此答案和官方文档HOWTO ,以获取有关描述符的更多信息。


#4楼

静态和类方法

正如其他答案所指出的,使用内置装饰器可以轻松实现静态和类方法:

class Test(object):# regular instance method:def MyMethod(self):pass# class method:@classmethoddef MyClassMethod(klass):pass# static method:@staticmethoddef MyStaticMethod():pass

与往常一样, MyMethod()的第一个参数绑定到类实例对象。 相反, MyClassMethod()的第一个参数绑定到类对象本身 (例如,在本例中为Test )。 对于MyStaticMethod() ,没有参数绑定,并且完全没有参数是可选的。

“静态变量”

但是,实现“静态变量”(无论如何, 可变的静态变量,如果这不是一个矛盾的话……)并不是那么简单。 正如millerdev 在回答中指出的那样 ,问题在于Python的类属性并不是真正的“静态变量”。 考虑:

class Test(object):i = 3  # This is a class attributex = Test()
x.i = 12   # Attempt to change the value of the class attribute using x instance
assert x.i == Test.i  # ERROR
assert Test.i == 3    # Test.i was not affected
assert x.i == 12      # x.i is a different object than Test.i

这是因为线xi = 12增加了一个新的实例属性ix ,而不是改变的值Testi属性。

可以通过将class属性变成一个属性来实现部分预期的静态变量行为,即,多个实例之间的属性同步(但与类本身同步;请参见下面的“陷阱”):

class Test(object):_i = 3@propertydef i(self):return type(self)._i@i.setterdef i(self,val):type(self)._i = val## ALTERNATIVE IMPLEMENTATION - FUNCTIONALLY EQUIVALENT TO ABOVE ##
## (except with separate methods for getting and setting i) ##class Test(object):_i = 3def get_i(self):return type(self)._idef set_i(self,val):type(self)._i = vali = property(get_i, set_i)

现在您可以执行以下操作:

x1 = Test()
x2 = Test()
x1.i = 50
assert x2.i == x1.i  # no error
assert x2.i == 50    # the property is synced

现在,静态变量将在所有类实例之间保持同步。

(注意:也就是说,除非类实例决定定义自己的_i版本,但是如果有人决定执行该操作,那么他们应得的是什么,不是吗???)

请注意,从技术上讲, i仍然根本不是“静态变量”; 它是一个property ,它是一种特殊的描述符类型。 但是, property行为现在等效于在所有类实例之间同步的(可变)静态变量。

不变的“静态变量”

对于不可变的静态变量行为,只需省略property设置器即可:

class Test(object):_i = 3@propertydef i(self):return type(self)._i## ALTERNATIVE IMPLEMENTATION - FUNCTIONALLY EQUIVALENT TO ABOVE ##
## (except with separate methods for getting i) ##class Test(object):_i = 3def get_i(self):return type(self)._ii = property(get_i)

现在尝试设置实例i属性将返回AttributeError

x = Test()
assert x.i == 3  # success
x.i = 12         # ERROR

要意识到的一个陷阱

请注意,上述方法只适用于你的类实例的工作-他们不会工作中使用类本身时 。 因此,例如:

x = Test()
assert x.i == Test.i  # ERROR# x.i and Test.i are two different objects:
type(Test.i)  # class 'property'
type(x.i)     # class 'int'

assert Test.i == xi会产生错误,因为Testi属性和x是两个不同的对象。

许多人会发现这令人惊讶。 但是,事实并非如此。 如果我们返回并检查我们的Test类定义(第二个版本),请注意以下这一行:

    i = property(get_i)

显然, Test的成员i必须是property对象,这是从property函数返回的对象的类型。

如果您发现上述混淆,您很可能仍会从其他语言(例如Java或c ++)的角度考虑它。 您应该研究property对象,有关返回Python属性的顺序,描述符协议和方法解析顺序(MRO)。

我在下面提出了上述“陷阱”的解决方案; 但是,我建议-极力地-您不要尝试执行以下操作,直到-至少-您要完全理解为什么assert Test.i = xi会导致错误。

REAL,ACTUAL静态变量Test.i == xi

我仅在下面提供(Python 3)解决方案,仅供参考。 我不赞成将其作为“好的解决方案”。 我对是否真的有必要在Python中模拟其他语言的静态变量行为感到怀疑。 但是,不管它是否真的有用,下面的内容应有助于进一步了解Python的工作方式。

更新:这种尝试确实非常糟糕 ; 如果您坚持要做这样的事情(提示:请不要; Python是一种非常优雅的语言,而不必像其他语言那样勉强使它表现为行为),请改用Ethan Furman的答案中的代码。

使用元类模拟其他语言的静态变量行为

元类是类的类。 Python中所有类的默认元类(即我认为Python 2.3之后的“新样式”类)是type 。 例如:

type(int)  # class 'type'
type(str)  # class 'type'
class Test(): pass
type(Test) # class 'type'

但是,您可以这样定义自己的元类:

class MyMeta(type): pass

并将其应用于您自己的类(仅适用于Python 3):

class MyClass(metaclass = MyMeta):passtype(MyClass)  # class MyMeta

下面是我创建的元类,它试图模仿其他语言的“静态变量”行为。 它基本上是通过将默认的getter,setter和deleter替换为版本来工作的,该版本检查以查看请求的属性是否为“静态变量”。

“静态变量”的目录存储在StaticVarMeta.statics属性中。 最初尝试使用替代解决顺序解决所有属性请求。 我将其称为“静态解决方案命令”或“ SRO”。 这是通过在给定类(或其父类)的“静态变量”集中查找请求的属性来完成的。 如果该属性未出现在“ SRO”中,则该类将回退到默认属性的“获取/设置/删除”行为(即“ MRO”)。

from functools import wrapsclass StaticVarsMeta(type):'''A metaclass for creating classes that emulate the "static variable" behaviorof other languages. I do not advise actually using this for anything!!!Behavior is intended to be similar to classes that use __slots__. However, "normal"attributes and __statics___ can coexist (unlike with __slots__). Example usage: class MyBaseClass(metaclass = StaticVarsMeta):__statics__ = {'a','b','c'}i = 0  # regular attributea = 1  # static var defined (optional)class MyParentClass(MyBaseClass):__statics__ = {'d','e','f'}j = 2              # regular attributed, e, f = 3, 4, 5  # Static varsa, b, c = 6, 7, 8  # Static vars (inherited from MyBaseClass, defined/re-defined here)class MyChildClass(MyParentClass):__statics__ = {'a','b','c'}j = 2  # regular attribute (redefines j from MyParentClass)d, e, f = 9, 10, 11   # Static vars (inherited from MyParentClass, redefined here)a, b, c = 12, 13, 14  # Static vars (overriding previous definition in MyParentClass here)'''statics = {}def __new__(mcls, name, bases, namespace):# Get the class objectcls = super().__new__(mcls, name, bases, namespace)# Establish the "statics resolution order"cls.__sro__ = tuple(c for c in cls.__mro__ if isinstance(c,mcls))# Replace class getter, setter, and deleter for instance attributescls.__getattribute__ = StaticVarsMeta.__inst_getattribute__(cls, cls.__getattribute__)cls.__setattr__ = StaticVarsMeta.__inst_setattr__(cls, cls.__setattr__)cls.__delattr__ = StaticVarsMeta.__inst_delattr__(cls, cls.__delattr__)# Store the list of static variables for the class object# This list is permanent and cannot be changed, similar to __slots__try:mcls.statics[cls] = getattr(cls,'__statics__')except AttributeError:mcls.statics[cls] = namespace['__statics__'] = set() # No static vars provided# Check and make sure the statics var names are stringsif any(not isinstance(static,str) for static in mcls.statics[cls]):typ = dict(zip((not isinstance(static,str) for static in mcls.statics[cls]), map(type,mcls.statics[cls])))[True].__name__raise TypeError('__statics__ items must be strings, not {0}'.format(typ))# Move any previously existing, not overridden statics to the static var parent class(es)if len(cls.__sro__) > 1:for attr,value in namespace.items():if attr not in StaticVarsMeta.statics[cls] and attr != ['__statics__']:for c in cls.__sro__[1:]:if attr in StaticVarsMeta.statics[c]:setattr(c,attr,value)delattr(cls,attr)return clsdef __inst_getattribute__(self, orig_getattribute):'''Replaces the class __getattribute__'''@wraps(orig_getattribute)def wrapper(self, attr):if StaticVarsMeta.is_static(type(self),attr):return StaticVarsMeta.__getstatic__(type(self),attr)else:return orig_getattribute(self, attr)return wrapperdef __inst_setattr__(self, orig_setattribute):'''Replaces the class __setattr__'''@wraps(orig_setattribute)def wrapper(self, attr, value):if StaticVarsMeta.is_static(type(self),attr):StaticVarsMeta.__setstatic__(type(self),attr, value)else:orig_setattribute(self, attr, value)return wrapperdef __inst_delattr__(self, orig_delattribute):'''Replaces the class __delattr__'''@wraps(orig_delattribute)def wrapper(self, attr):if StaticVarsMeta.is_static(type(self),attr):StaticVarsMeta.__delstatic__(type(self),attr)else:orig_delattribute(self, attr)return wrapperdef __getstatic__(cls,attr):'''Static variable getter'''for c in cls.__sro__:if attr in StaticVarsMeta.statics[c]:try:return getattr(c,attr)except AttributeError:passraise AttributeError(cls.__name__ + " object has no attribute '{0}'".format(attr))def __setstatic__(cls,attr,value):'''Static variable setter'''for c in cls.__sro__:if attr in StaticVarsMeta.statics[c]:setattr(c,attr,value)breakdef __delstatic__(cls,attr):'''Static variable deleter'''for c in cls.__sro__:if attr in StaticVarsMeta.statics[c]:try:delattr(c,attr)breakexcept AttributeError:passraise AttributeError(cls.__name__ + " object has no attribute '{0}'".format(attr))def __delattr__(cls,attr):'''Prevent __sro__ attribute from deletion'''if attr == '__sro__':raise AttributeError('readonly attribute')super().__delattr__(attr)def is_static(cls,attr):'''Returns True if an attribute is a static variable of any class in the __sro__'''if any(attr in StaticVarsMeta.statics[c] for c in cls.__sro__):return Truereturn False

#5楼

可以有static类变量,但可能不值得。

这是用Python 3编写的概念证明-如果任何确切的细节有误,则可以对代码进行调整以使其与static variable含义完全匹配:


class Static:def __init__(self, value, doc=None):self.deleted = Falseself.value = valueself.__doc__ = docdef __get__(self, inst, cls=None):if self.deleted:raise AttributeError('Attribute not set')return self.valuedef __set__(self, inst, value):self.deleted = Falseself.value = valuedef __delete__(self, inst):self.deleted = Trueclass StaticType(type):def __delattr__(cls, name):obj = cls.__dict__.get(name)if isinstance(obj, Static):obj.__delete__(name)else:super(StaticType, cls).__delattr__(name)def __getattribute__(cls, *args):obj = super(StaticType, cls).__getattribute__(*args)if isinstance(obj, Static):obj = obj.__get__(cls, cls.__class__)return objdef __setattr__(cls, name, val):# check if object already existsobj = cls.__dict__.get(name)if isinstance(obj, Static):obj.__set__(name, val)else:super(StaticType, cls).__setattr__(name, val)

并在使用中:

class MyStatic(metaclass=StaticType):"""Testing static vars"""a = Static(9)b = Static(12)c = 3class YourStatic(MyStatic):d = Static('woo hoo')e = Static('doo wop')

和一些测试:

ms1 = MyStatic()
ms2 = MyStatic()
ms3 = MyStatic()
assert ms1.a == ms2.a == ms3.a == MyStatic.a
assert ms1.b == ms2.b == ms3.b == MyStatic.b
assert ms1.c == ms2.c == ms3.c == MyStatic.c
ms1.a = 77
assert ms1.a == ms2.a == ms3.a == MyStatic.a
ms2.b = 99
assert ms1.b == ms2.b == ms3.b == MyStatic.b
MyStatic.a = 101
assert ms1.a == ms2.a == ms3.a == MyStatic.a
MyStatic.b = 139
assert ms1.b == ms2.b == ms3.b == MyStatic.b
del MyStatic.b
for inst in (ms1, ms2, ms3):try:getattr(inst, 'b')except AttributeError:passelse:print('AttributeError not raised on %r' % attr)
ms1.c = 13
ms2.c = 17
ms3.c = 19
assert ms1.c == 13
assert ms2.c == 17
assert ms3.c == 19
MyStatic.c = 43
assert ms1.c == 13
assert ms2.c == 17
assert ms3.c == 19ys1 = YourStatic()
ys2 = YourStatic()
ys3 = YourStatic()
MyStatic.b = 'burgler'
assert ys1.a == ys2.a == ys3.a == YourStatic.a == MyStatic.a
assert ys1.b == ys2.b == ys3.b == YourStatic.b == MyStatic.b
assert ys1.d == ys2.d == ys3.d == YourStatic.d
assert ys1.e == ys2.e == ys3.e == YourStatic.e
ys1.a = 'blah'
assert ys1.a == ys2.a == ys3.a == YourStatic.a == MyStatic.a
ys2.b = 'kelp'
assert ys1.b == ys2.b == ys3.b == YourStatic.b == MyStatic.b
ys1.d = 'fee'
assert ys1.d == ys2.d == ys3.d == YourStatic.d
ys2.e = 'fie'
assert ys1.e == ys2.e == ys3.e == YourStatic.e
MyStatic.a = 'aargh'
assert ys1.a == ys2.a == ys3.a == YourStatic.a == MyStatic.a

#6楼

类工厂python3.6中的静态变量

对于使用类工厂python3.6和最多人使用nonlocal关键字把它添加到类的范围/上下文被创建,如下所示:

>>> def SomeFactory(some_var=None):
...     class SomeClass(object):
...         nonlocal some_var
...         def print():
...             print(some_var)
...     return SomeClass
...
>>> SomeFactory(some_var="hello world").print()
hello world

#7楼

绝对可以,Python本身没有明确的静态数据成员,但是我们可以这样做

class A:counter =0def callme (self):A.counter +=1def getcount (self):return self.counter
>>> x=A()
>>> y=A()
>>> print(x.getcount())
>>> print(y.getcount())
>>> x.callme()
>>> print(x.getcount())
>>> print(y.getcount())

输出

0
0
1
1

说明

here object (x) alone increment the counter variable
from 0 to 1 by not object y. But result it as "static counter"

#8楼

关于Python属性查找的一个非常有趣的观点是,它可以用于创建“ 虚拟变量”:

class A(object):label="Amazing"def __init__(self,d): self.data=ddef say(self): print("%s %s!"%(self.label,self.data))class B(A):label="Bold"  # overrides A.labelA(5).say()      # Amazing 5!
B(3).say()      # Bold 3!

通常,在创建它们之后,没有任何分配。 请注意,查找使用self是因为,尽管在不与特定实例相关联的意义上,虽然label是静态的,但该值仍取决于实例(的类)。


#9楼

是的,绝对可以在python中编写静态变量和方法。

静态变量:在类级别声明的变量称为静态变量,可以使用类名称直接访问。

    >>> class A:...my_var = "shagun">>> print(A.my_var)shagun

实例变量:与某个类的实例相关并访问的变量是实例变量。

   >>> a = A()>>> a.my_var = "pruthi">>> print(A.my_var,a.my_var)shagun pruthi

静态方法:与变量类似,可以使用Name类直接访问静态方法。 无需创建实例。

但请记住,静态方法无法在python中调用非静态方法。

    >>> class A:...     @staticmethod...     def my_static_method():...             print("Yippey!!")... >>> A.my_static_method()Yippey!!

#10楼

您可以使用列表或字典来获得实例之间的“静态行为”。

class Fud:class_vars = {'origin_open':False}def __init__(self, origin = True):self.origin = originself.opened = Trueif origin:self.class_vars['origin_open'] = Truedef make_another_fud(self):''' Generating another Fud() from the origin instance '''return Fud(False)def close(self):self.opened = Falseif self.origin:self.class_vars['origin_open'] = Falsefud1 = Fud()
fud2 = fud1.make_another_fud()print (f"is this the original fud: {fud2.origin}")
print (f"is the original fud open: {fud2.class_vars['origin_open']}")
# is this the original fud: False
# is the original fud open: Truefud1.close()print (f"is the original fud open: {fud2.class_vars['origin_open']}")
# is the original fud open: False

#11楼

在类定义内声明但在方法内声明的变量是类或静态变量:

>>> class MyClass:
...     i = 3
...
>>> MyClass.i
3

正如@ millerdev指出的那样,这将创建一个类级别的i变量,但这不同于任何实例级别的i变量,因此您可以

>>> m = MyClass()
>>> m.i = 4
>>> MyClass.i, m.i
>>> (3, 4)

这与C ++和Java不同,但与C#并没有太大区别,在C#中,无法使用对实例的引用来访问静态成员。

了解有关类和类对象的Python教程必须说些什么 。

@Steve Johnson已经回答了有关静态方法的问题 ,该方法也记录在Python Library Reference中的“内置函数”下 。

class C:@staticmethoddef f(arg1, arg2, ...): ...

@beidy建议使用classmethod而不是staticmethod,因为该方法随后将类类型作为第一个参数,但是对于这种方法相对于staticmethod的优点,我仍然有些模糊。 如果您也是,那可能没关系。


#12楼

就个人而言,每当我需要静态方法时,我都会使用类方法。 主要是因为我将类作为参数。

class myObj(object):def myMethod(cls)...myMethod = classmethod(myMethod)

或使用装饰器

class myObj(object):@classmethoddef myMethod(cls)

对于静态属性..它时候您查找一些python定义..变量可以随时更改。 有两种类型,它们是可变的和不可变的。此外,还有类属性和实例属性。从Java和C ++的意义上说,没有什么比静态属性更像

如果与类没有任何关系,为什么要使用pythonic意义上的静态方法! 如果您是我,则可以使用classmethod或独立于类定义方法。


#13楼

python中的静态方法称为classmethod 。 看下面的代码

class MyClass:def myInstanceMethod(self):print 'output from an instance method'@classmethoddef myStaticMethod(cls):print 'output from a static method'>>> MyClass.myInstanceMethod()
Traceback (most recent call last):File "<stdin>", line 1, in <module>
TypeError: unbound method myInstanceMethod() must be called [...]>>> MyClass.myStaticMethod()
output from a static method

注意,当我们调用方法myInstanceMethod时 ,我们得到一个错误。 这是因为它要求在此类的实例上调用该方法。 使用装饰器 @classmethod将方法myStaticMethod设置为类方法。

只是为了一笑而过,我们可以通过传入类的实例来调用类的myInstanceMethod ,如下所示:

>>> MyClass.myInstanceMethod(MyClass())
output from an instance method

#14楼

@Blair Conrad说,在类定义中声明的静态变量而不是在方法内部声明的静态变量是类或“静态”变量:

>>> class Test(object):
...     i = 3
...
>>> Test.i
3

这里有一些陷阱。 从上面的示例继续进行:

>>> t = Test()
>>> t.i     # "static" variable accessed via instance
3
>>> t.i = 5 # but if we assign to the instance ...
>>> Test.i  # we have not changed the "static" variable
3
>>> t.i     # we have overwritten Test.i on t by creating a new attribute t.i
5
>>> Test.i = 6 # to change the "static" variable we do it by assigning to the class
>>> t.i
5
>>> Test.i
6
>>> u = Test()
>>> u.i
6           # changes to t do not affect new instances of Test# Namespaces are one honking great idea -- let's do more of those!
>>> Test.__dict__
{'i': 6, ...}
>>> t.__dict__
{'i': 5}
>>> u.__dict__
{}

请注意,当将属性i直接设置在t上时,实例变量ti如何与“静态”类变量不同步。 这是因为i被重新绑定在t名称空间中,该名称空间与Test名称空间不同。 如果要更改“静态”变量的值,则必须在其最初定义的范围(或对象)内进行更改。 我将“ static”用引号引起来,因为Python实际上没有C ++和Java所具有的静态变量。

尽管它没有对静态变量或方法进行任何具体说明,但是Python教程提供了有关类和类对象的一些相关信息。

@Steve Johnson还回答了有关静态方法的问题,该方法也记录在Python库参考的“内置函数”下。

class Test(object):@staticmethoddef f(arg1, arg2, ...):...

@beid还提到了classmethod,它与staticmethod相似。 类方法的第一个参数是类对象。 例:

class Test(object):i = 3 # class (or static) variable@classmethoddef g(cls, arg):# here we can use 'cls' instead of the class name (Test)if arg > cls.i:cls.i = arg # would be the same as Test.i = arg1


#15楼

为了避免任何潜在的混乱,我想对比静态变量和不可变对象。

一些原始对象类型(例如整数,浮点数,字符串和touples)在Python中是不可变的。 这意味着如果给定名称引用的对象属于上述对象类型之一,则无法更改。 可以将名称重新分配给其他对象,但是对象本身不能更改。

使变量为静态使此步骤更进一步,它不允许变量名指向除当前指向的对象之外的任何对象。 (注意:这是一个通用的软件概念,并不特定于Python;有关在Python中实现静态功能的信息,请参见其他人的帖子)。


#16楼

您还可以随时将类变量添加到类中

>>> class X:
...     pass
...
>>> X.bar = 0
>>> x = X()
>>> x.bar
0
>>> x.foo
Traceback (most recent call last):File "<interactive input>", line 1, in <module>
AttributeError: X instance has no attribute 'foo'
>>> X.foo = 1
>>> x.foo
1

类实例可以更改类变量

class X:l = []def __init__(self):self.l.append(1)print X().l
print X().l>python test.py
[1]
[1, 1]

#17楼

您还可以使用元类将类强制为静态。

class StaticClassError(Exception):passclass StaticClass:__metaclass__ = abc.ABCMetadef __new__(cls, *args, **kw):raise StaticClassError("%s is a static class and cannot be initiated."% cls)class MyClass(StaticClass):a = 1b = 3@staticmethoddef add(x, y):return x+y

然后,每当您偶然尝试初始化MyClass时 ,都会收到一个StaticClassError。


#18楼

关于静态属性和实例属性的一件事要特别注意,如下面的示例所示:

class my_cls:my_prop = 0#static property
print my_cls.my_prop  #--> 0#assign value to static property
my_cls.my_prop = 1
print my_cls.my_prop  #--> 1#access static property thru' instance
my_inst = my_cls()
print my_inst.my_prop #--> 1#instance property is different from static property
#after being assigned a value
my_inst.my_prop = 2
print my_cls.my_prop  #--> 1
print my_inst.my_prop #--> 2

这意味着在将值分配给实例属性之前,如果我们尝试通过实例访问属性,则将使用静态值。 python类中声明的每个属性在内存中始终具有一个静态插槽

Python中可以使用静态类变量吗?相关推荐

  1. Python中的静态类变量和方法

    问: 如何在 Python 中创建静态类变量或方法? 答1: huntsbot.com聚合了超过10+全球外包任务平台的外包需求,寻找外包任务与机会变的简单与高效. 在类定义内但不在方法内声明的变量是 ...

  2. 在python中是否可以使用if作为变量名_在Python中可以使用if 作为变量名_python使用符号 标示注释...

    在Python中可以使用if 作为变量名 答:× " src=" " style="max-width: 100%; display: inline;" ...

  3. 在python语言中不能作为变量名的是什么_4、 在 Python 中可以使用 if 作为变量名。 (1.0分)_学小易找答案...

    [判断题]2. Python 变量使用前必须先声明 , 并且一旦声明就不能在当前作用域内改变其类型. (1.0分) [填空题]Python语句''.join(list('hello world!')) ...

  4. python中if有几种使用方式_在 Python 中可以使用 if 作为变量名。 (2.0分)_学小易找答案...

    [判断题]尽管可以使用 import 语句一次导入任意多个标准库或扩展库,但是仍建议每次只导入一个标准库或扩展库. (2.0分) [简答题]写出 Python 运算符 & 的两种功能? (5. ...

  5. 下列可作为python变量名的是1name_在Python中可以使用 id 作为变量名,尽管不建议这样做。...

    在Python中可以使用 id 作为变量名,尽管不建议这样做. 答:正确 下列四环素类药物不良反应中,哪一个是错误的 答:抑制骨髓造血 There ___ no need to feel homesi ...

  6. Python中可以使用字符串处理函数来删除指定的字符或者字符集合。在这篇文章中,我们将会介绍如何使用Python来删除一个或多个指定字符。作为标题,《用Pyth...

    Python中可以使用字符串处理函数来删除指定的字符或者字符集合.在这篇文章中,我们将会介绍如何使用Python来删除一个或多个指定字符.作为标题,<用Python删除指定字符(Removing ...

  7. python静态变量计数器_如何在Python中使用静态变量在计数

    今天,在用Python写一个统计一个文件下有多少文件的小标本时,遇到了一个很棘手的问题.如何在Python中使用静态变量来计数.然后,就在网上一通查找,找的方法都是利用类的方法来实现静态变量.说实话没 ...

  8. python静态变量命名_Python中的静态类变量

    在Python中可以有静态类变量或方法吗?需要什么语法才能做到这一点? 在类定义中声明的变量,而不是在一个方法中声明的是类或静态变量:>>> class MyClass: ... i ...

  9. 关于如何在Python中使用静态、类或抽象方法的权威指南

    Python中方法的工作方式 方法是存储在类属性中的函数,你可以用下面这种方式声明和访问一个函数 >>> class Pizza(object):... def __init__(s ...

最新文章

  1. python装饰器两层和三层区别_学习python的第十五天(函数的装饰器,两层装饰器和三层装饰器)...
  2. Python Django 全局上下文代码示例
  3. CSS实现div梯形分割
  4. mysql禁止自动优化_MySQL必须调整的10项配置优化
  5. win2003域迁移实战记录
  6. slf4j mysql_能显示sql语句,没有报错,但是MySQL里没有表?还有,slf4j是必须的吗?...
  7. php 日期相减 时分秒,PHP计算两个时间戳间隔的日时分秒的代码实例
  8. ubuntu18重启vncserver_Ubuntu 18.04 LTS安装vncserver虚拟网络控制台
  9. Nginx+tomcat整合
  10. typescript的类型转化
  11. 射频测试系统软件,射频测试可以不懂测试仪器?“仪器程控系统”软件助你极大提升测试效率...
  12. Python 入门学习 详细知识点+典型例题 /自学笔记(四)
  13. 淘宝订单信息获取接口,淘宝开放平台R2权限,淘宝开放平台订单获取接口
  14. pandas中的绘图函数(什么是kde)
  15. IE浏览器停止服务,曾经的王者为何退役?解析浏览器背后的技术是什么?
  16. Soul网关-day16
  17. 一:Grafana-graph面板用法
  18. 极简yolov5转torchscript
  19. 本地备份、异地备份、完整备份、增量备份、差异备份的概念与异同
  20. Excel2016设置下拉选项并自动匹配单元格颜色

热门文章

  1. android 怎么判断activity 从哪里启动的
  2. Ninja提升编译速度的方法-Android10.0编译系统(十)
  3. Flutter开发之认识Flutter(二)
  4. 7.13 T2 Shit 题(shit)
  5. IoC容器和Dependency Injection模式
  6. 扩展cocos slider控件,支持禁用置灰
  7. 微信小程序客服消息使用指南
  8. 内存映像分析工具Eclipse Memory Analyzer
  9. FineUI经典项目展示(1)生产在线管理系统
  10. mybatis中(Oracle)关于insert时主键自动加1的使用方法