如果我有以下代码:
class Foo(object):
bar = 1
def bah(self):
print(bar)
f = Foo()
f.bah()
它抱怨
未定义全局名称“bar”
我如何访问类/静态变量栏内的方法bah?
如果我有以下代码:
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()