2016-10-06 7 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()の機能を持つ3つのクラスを持っています。しかし、これらのクラスには、互いに継承していないため、関係はありません。答えは単純です: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のような関連クラスがあっても、現在のメソッドは最後のメソッドをオーバーライドします。

各クラスは、あなたの例では無関係であるため、一意的に呼び出されます(ただし、すべてのクラスがクラス型であることを除く)。

関連する問題