我正试图调用一个函数来初始化我的全局类级变量。请注意,由于某些原因,我无法编写构造函数来完成这项工作(原因:我正在为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
...
但这将破坏使用全局类级别变量的全部目的。我想在其他函数中使用一个类级变量来重新使用。
不能为还不存在的实例调用实例方法。如果你想让它独立于任何实例,并且你调用的函数不需要来自实例的任何信息,你可以使用@staticmethod装饰器,这样你就可以静态地调用gethostname。
首先:它们不是全局变量;它们是类变量。(全局参数在模块范围内定义。)
如果_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()
或者推迟初始化类变量直到定义了CCD_ 8之后。在这种情况下,_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()