【问题标题】:Static variable declaration in python classes [duplicate]python类中的静态变量声明[重复]
【发布时间】:2021-10-30 12:52:23
【问题描述】:

下面两个例子有什么区别?

#Example 1
class Foo:
    
    var = None
    
    def __init__(self):
        self.var = 1
        
#Example 2
class Bar:

    var = None
    
    def __init__(self):
        Foo.var = 1

var 在这两个示例之间有何不同?

Example 1 是静态变量还是将变量声明错误地用作静态变量?

【问题讨论】:

  • 示例 1 定义了类属性和实例属性。示例 2 只定义了一个类属性,Bar.__init__ 每次调用时都会更新。

标签: python static-variables


【解决方案1】:

简单

  • Foo.var 更改类状态。
  • self.var 更改对象状态。
class Foo():

  var = None
    
  def __init__(self):
    Foo.var = 1

class Bar():

  var = None

  def __init__(self):
    self.var = 1

print('Foo before', Foo.var)
print('Bar before', Bar.var)

foo = Foo()
bar = Bar()

print('foo', foo.var)
print('bar', bar.var)

print('Foo after', Foo.var)
print('Bar after', Bar.var)

Foo.var = 2
Bar.var = 2

print('foo after class changed', foo.var)
print('bar after class changed', bar.var)

输出:

Foo before None
Bar before None
foo 1
bar 1
Foo after 1
Bar after None
foo after class changed 2
bar after class changed 1

关于第二个问题:

示例 1 是静态变量还是将变量声明错误地用作静态变量?

vars 都是 static (or class) variables。您可以在不创建实例的情况下调用它们。 (Foo.var, Bar.var)

class Foo():

  class_variable = 'c'
    
  def __init__(self):
    self.instance_variable = 'i'

print('Class variable of class', Foo.class_variable)

try:
  print(Foo.instance_variable)
except Exception as e:
  print('This error happens when we call instance variable without creating instance')
  print(e)

instance = Foo()

print('Class variable of instance', instance.class_variable)
print('Instance variable of instance', instance.instance_variable)
Class variable of class c
This error happens when we call instance variable without creating instance
type object 'Foo' has no attribute 'instance_variable'
Class variable of instance c
Instance variable of instance i

【讨论】:

    【解决方案2】:

    将示例从 FooBar 更改为汽车和卡车,因为我认为熟悉的对象可能更容易理解:

    #Example 1
    class Car:
        
        age = None
        
        def __init__(self):
            self.age = 1
    
        def olden(self):
            self.age += 1
            
    #Example 2
    class Truck:
    
        age = None
        
        def __init__(self):
            Truck.age = 1
            
        def olden(self):
            Truck.age += 1
    
    print("---Cars---")
    
    accord = Car()
    print(f"{accord.age=}")
    accord.olden()
    print(f"{accord.age=}")
    
    camry = Car()
    print(f"{camry.age=}")
    print(f"{accord.age=}")
    
    print("\n---Trucks---")
    ram = Truck()
    print(f"{ram.age=}")
    ram.olden()
    print(f"{ram.age=}")
    
    f150 = Truck()
    print(f"{f150.age=}")
    print(f"{ram.age=}")
    

    打印出来

    ---Cars---
    accord.age=1
    accord.age=2
    camry.age=1
    accord.age=2
    
    ---Trucks---
    ram.age=1
    ram.age=2
    f150.age=1
    ram.age=1
    

    正在发生的事情是使用self 访问汽车的变量,并且由于雅阁和凯美瑞是独立的汽车对象,它们可以独立老化。

    正在使用Truck 访问卡车的变量,因此创建 F150 会重置现有 Ram 的 age

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2018-07-12
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多