如果我有以下代码:

class Foo(object):
    bar = 1

    def bah(self):
        print(bar)
            
f = Foo()
f.bah()

它抱怨

未定义全局名称“bar”

我如何访问类/静态变量栏内的方法bah?


当前回答

你可以通过对象访问类变量,也可以从类外部或类内部直接通过类名访问类变量,基本上,你应该直接通过类名访问类变量,因为如果有相同名称的类和实例变量,相同名称的实例变量将被优先考虑,而相同名称的实例变量在被对象访问时被忽略。因此,使用类名比使用对象访问类变量更安全。

例如,你可以通过对象访问类变量,也可以直接从类外部通过类名访问类变量,如下所示:

class Person:
    name = "John" # Class variable

obj = Person()
print(obj.name) # By object
print(Person.name) # By class name

输出:

John
John

但是,如果你通过object添加了与类变量相同的name实例变量:

class Person:
    name = "John" # Class variable

obj = Person()
obj.name = "Tom" # Adds the same name instance variable as class variable
print(obj.name) # By object
print(Person.name) # By class name

或者,如果你在__init__()中通过self添加与类变量相同的name实例变量:

class Person:
    name = "John" # Class variable
    
    def __init__(self, name):
        self.name = name # Adds the same name instance variable as class variable

obj = Person("Tom")
print(obj.name) # By object
print(Person.name) # By class name

当被object访问时,相同名称的实例变量将被优先排序:

Tom  # By object
John # By class name

并且,你也可以通过self和直接通过类名从实例方法内部访问类变量,如下所示:

class Person:
    name = "John" # Class variable
        
    def test(self): # Instance method
        print(self.name) # By "self"
        print(Person.name) # By class name

obj = Person()
obj.test()

输出:

John
John

但是,如果你通过object添加了与类变量相同的name实例变量:

class Person:
    name = "John" # Class variable
        
    def test(self): # Instance method
        print(self.name) # By "self"
        print(Person.name) # By class name

obj = Person()
obj.name = "Tom" # Adds the same name instance variable as the class variable
obj.test()

或者,如果你在__init__()中通过self添加与类变量相同的name实例变量:

class Person:
    name = "John" # Class variable
    
    def __init__(self, name):
        self.name = name # Adds the same name instance variable as the class variable
        
    def test(self): # Instance method
        print(self.name) # By "self"
        print(Person.name) # Directly by class name

obj = Person("Tom")
obj.test()

当被self访问时,相同名称的实例变量将被优先排序:

Tom  # By "self"
John # By class name

其他回答

定义类方法:

class Foo(object):
    bar = 1
    @classmethod
    def bah(cls):    
        print cls.bar

现在如果bah()必须是实例方法(即有访问self的权限),你仍然可以直接访问类变量。

class Foo(object):
    bar = 1
    def bah(self):    
        print self.bar

bar是你的静态变量,你可以使用Foo.bar访问它。

基本上,你需要用Class name限定你的静态变量。

你可以通过对象访问类变量,也可以从类外部或类内部直接通过类名访问类变量,基本上,你应该直接通过类名访问类变量,因为如果有相同名称的类和实例变量,相同名称的实例变量将被优先考虑,而相同名称的实例变量在被对象访问时被忽略。因此,使用类名比使用对象访问类变量更安全。

例如,你可以通过对象访问类变量,也可以直接从类外部通过类名访问类变量,如下所示:

class Person:
    name = "John" # Class variable

obj = Person()
print(obj.name) # By object
print(Person.name) # By class name

输出:

John
John

但是,如果你通过object添加了与类变量相同的name实例变量:

class Person:
    name = "John" # Class variable

obj = Person()
obj.name = "Tom" # Adds the same name instance variable as class variable
print(obj.name) # By object
print(Person.name) # By class name

或者,如果你在__init__()中通过self添加与类变量相同的name实例变量:

class Person:
    name = "John" # Class variable
    
    def __init__(self, name):
        self.name = name # Adds the same name instance variable as class variable

obj = Person("Tom")
print(obj.name) # By object
print(Person.name) # By class name

当被object访问时,相同名称的实例变量将被优先排序:

Tom  # By object
John # By class name

并且,你也可以通过self和直接通过类名从实例方法内部访问类变量,如下所示:

class Person:
    name = "John" # Class variable
        
    def test(self): # Instance method
        print(self.name) # By "self"
        print(Person.name) # By class name

obj = Person()
obj.test()

输出:

John
John

但是,如果你通过object添加了与类变量相同的name实例变量:

class Person:
    name = "John" # Class variable
        
    def test(self): # Instance method
        print(self.name) # By "self"
        print(Person.name) # By class name

obj = Person()
obj.name = "Tom" # Adds the same name instance variable as the class variable
obj.test()

或者,如果你在__init__()中通过self添加与类变量相同的name实例变量:

class Person:
    name = "John" # Class variable
    
    def __init__(self, name):
        self.name = name # Adds the same name instance variable as the class variable
        
    def test(self): # Instance method
        print(self.name) # By "self"
        print(Person.name) # Directly by class name

obj = Person("Tom")
obj.test()

当被self访问时,相同名称的实例变量将被优先排序:

Tom  # By "self"
John # By class name

而不是酒吧使用自我。bar或Foo.bar。赋值给Foo。Bar将创建一个静态变量,并分配给self。Bar将创建一个实例变量。

class Foo(object):
     bar = 1
     def bah(self):
         print Foo.bar

f = Foo() 
f.bah()