假设我将课程Test
定义为:
class Test
test_var = 2
def test_func():
print(test_var)
我可以找出test_var
很好的内容:
>>> Test.test_var
2
...但是调用Test.test_func()
不起作用。
>>> Test.test_func()
Traceback (most recent call last):
File "<stdin>", line 1, in <module>
File "<stdin>", line 4, in test
NameError: name 'test_var' is not defined
如果我像这样更改Test.test_func()
(请注意这是伪代码):
redef test_func():
print(Test.test_var)
工作正常:
>>> Test.test_func()
2
......这是有道理的。但是我怎样才能使第一个例子起作用,记住我希望test_func是一个实例方法?
请注意,上面发布的代码是示例代码,因此应忽略拼写错误。
答案 0 :(得分:1)
您始终可以通过实例访问类级属性,即self
,只要您没有使用相同名称的实例属性对它们进行阴影处理即可。所以:
def test_func(self):
print(self.test_var)
答案 1 :(得分:0)
如果你不需要自己,你需要将自己(几乎总是你想要的)传递给类方法,或者添加@classmethod或@staticmethod装饰器。然后创建该类的实例并调用test_func方法。
Examples:
# test_var is an class variable and test_func has a classmethod decorator
>>> class Test:
... test_var = 2
... @classmethod
... def test_func(cls):
... print(cls.test_var)
...
>>> t = Test()
>>> t.test_func()
2
# test_var is an class variable and test_func has a staticmethod decorator
>>> class Test:
... test_var = 2
... @staticmethod
... def test_func():
... print(Test.test_var)
...
>>> t = Test()
>>> t.test_func()
2
# test_var is an instance variable here
>>> class Test:
... self.test_var = 2
... def test_func(self):
... print(self.test_var)
...
>>> t = Test()
>>> t.test_func()
2
答案 2 :(得分:0)
在您的示例中,test_func
只是一个函数,虽然它在类命名空间中定义,但函数本身并不知道类命名空间。您需要常规实例方法或类方法。
class Test:
test_var = 2
def instance_test(self):
# instance methods will look in self first and class namespace second
print(self.test_var)
@classmethod
def class_test(cls):
# class methods take the class itself as first argument
print(cls.test_var)
t = Test()
t.instance_test()
Test.class_test()