2016-10-06 64 views
0

假設我們在不同的類中聲明一個具有相同名稱的靜態方法。可能嗎?靜態方法重載

如果是,那麼將如何調用哪個函數?

class abc: 
    @staticmethod 
    def xyz(): 
     print 'class_abc' 
class abc1: 
    @staticmethod 
    def xyz(): 
     print 'class_abc1' 
class abc2: 
    @staticmethod 
    def xyz(): 
     print 'class_abc2' 

那麼,輸出是什麼以及我們如何調用不同類的不同功能?

+0

您的縮進在您的第一個示例中關閉。 –

+1

它實際上是覆蓋,這與重載不同。但是,在這個例子中發生了什麼? –

+0

除了識別問題之外,這個問題沒有意義,因爲在這個例子中甚至沒有子類。 – lucasnadalutti

回答

2

您有三個類,每個類都有xyz()函數。但是這些類沒有關係,因爲它們並不是相互繼承的。所以答案很簡單:xyz()將被稱爲調用該方法的類。

例如:abc.xyz()將調用abc類的xyz()功能。同樣,您可以撥打ab1abc2的功能:abc1.xyz()abc2.xyz()

1

你似乎誤解了事情。類爲它們自己引入了一個單獨的名稱空間,因此完全可以在不同的類中創建具有相同名稱的函數。除了類似的名稱外,這些功能與其他方式沒有任何關係。

運行<classname>.xyz()只需調用xyz()並打印相應的消息。

即使有類之間的關係,即形式的子類關係:

class abc: 
    @staticmethod 
    def xyz(): 
     print 'class_abc' 

class abc1(abc): 
    @staticmethod 
    def xyz(): 
     print 'class_abc1' 

class abc2(abc1): 
    @staticmethod 
    def xyz(): 
     print 'class_abc2' 

最新的xyz定義將覆蓋以前存在的條目,並影響將是相同,即abc2.xyz()會打印class_abc2abc1.xyz()打印class_abc1等。

此外,請注意,您使用的是Python 2.x,但實際上並沒有從object繼承。這不會創造出大多數人在今天意識到的意義上的課堂,請參閱What is the difference between old style and new style classes in Python?以更好地瞭解這些內容。

0

假設我們在不同的地方聲明一個名稱相同的靜態方法有可能嗎?

如果可能的話再怎麼和函數將被調用。?

這是可能的,因爲類有它們自己的範圍。 Python以不同的方式處理您的示例中的每個靜態方法。即使你的類在相關的地方,比如在@Jim Fasarakis-Hilliard例子中,當前的方法也會覆蓋最後的方法。

每個方法都會被唯一地調用,因爲每個類在你的例子中是不相關的(除了所有的類都是類的類)。