簡體   English   中英

在任何方法之外調用函數但在類中?

[英]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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM