![](/img/trans.png)
[英]When I call a method inside a class it is not working but it works outside?
[英]Call a function outside any method but inside a class?
我正在尝试调用函数来初始化我的
全局
类级变量。 请注意,由于某种原因,我无法编写构造函数来完成这项工作。 (原因:我正在为Tempest写一个测试用例)
码:
class my_class(ParentClass):
username = "abc"
password = "123"
hostname = self._get_hostname() # Error: self is undefined
hostname = _get_hostname() # Error: _get_hostname is undefined
def myFunct(self):
...
...
def _get_hostname(self):
...
...
甚至可以在python中使用类函数初始化
全局
类级变量?
注1:我还尝试在写入_get_hostname()
函数后执行hostname
初始化,但没有用。
注2:我可以在一个函数中执行hostname
初始化,例如:
def myFunction(self):
hostname = self._get_hostname()
# do something with hostname
...
但这会破坏使用
全局
类级变量的整个目的。 我想使用类级变量在其他函数中重用 。
第一:它们不是全局变量; 它们是类变量。 (全局变量在模块范围内定义。)
如果_get_hostname()
实际上根本不使用 self
,你可以做一些有点粗略的事情:确保在使用它之前定义它,然后用假的第一个参数调用它。
class my_class(ParentClass):
def _get_hostname(self):
...
hostname = _get_hostname(None) # Doesn't matter what
这是有效的,因为当您在class
语句中调用它时,您仍然可以将其视为常规函数。 它必须在使用它之前定义,就像任何函数一样。
如果它确实需要引用一个对象(或者甚至只是一个类),那么这将不起作用,因为该类还不存在。 您可以做的最好的事情是在class
语句之前定义一个不使用类本身并调用它的函数。 (如果以前的选项可行,你也可以这样做但是......令人反感。)
def _get_hostname():
...
class my_class(ParentClass):
hostname = _get_hostname()
或者推迟初始化类变量,直到定义了class
。 在这种情况下, _get_hostname
可能应该声明为静态方法或类方法,这样您就不必实例化类来初始化类变量。
class my_class(ParentClass):
@classmethod
def _get_hostname1(cls):
...
@staticmethod
def _get_hostname2():
...
my_class.hostname = my_class._get_hostname1()
my_class.hostname = my_class._get_hostname2()
您不能为尚不存在的实例调用实例方法。 如果您希望它独立于任何实例,并且您调用的函数不需要实例中的任何信息,则可以使用@staticmethod装饰器,以便可以静态调用get hostname。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.