2017-02-11 3 views
0

私はPythonでメソッドとコンストラクタを含むクラスを持っています。コンストラクタの戻り値はオブジェクトですが、私はnumbers.Number型のようなクラス(コンストラクタ)の戻り値が必要です。オブジェクトのスーパークラスを変更するには?

このクラスのスーパークラスとしてnumbers.Numberを追加してクラスの戻り値を変更することはできますか?もしそうなら、誰かがそれを行う方法を記述できますか?


class Num(Parent): 
    #Some Code 
    #Here Parent must be inherited 

class Foo(Num): 
    #Foo Should return of type numbers.Number 
    #Here Num must be inherited 

今、私たちはFooのコンストラクタを呼び出すたびFoonumber.Number値を返すようにしたいです。

+3

あなたのファクトリクラスは数字を持っている必要はありません。その型のオブジェクトを作成するための基本クラスとしてのNumber。その型のオブジェクトを作成して返すだけの方法があります。たぶん私は何かが欠けているでしょう。 –

+0

Pythonのコンストラクターは何も返しません。それらがすでにあるクラスのインスタンスと呼ばれる時には、コンストラクタは既に必要な初期化を行います。作成されたオブジェクトの型を決定する '__new __()'メソッドをオーバーライドすることで、あなたが望むことができるかもしれません。あるいは、「仮想コンストラクター」と呼ばれることもあり、その用語を検索する必要があるかもしれません。あなたがしようとしていることを説明するあなたの質問に実際のコードがあったら、より良い(または少なくとももっと具体的な)答えを得るかもしれません。 – martineau

+0

@martineauあなたは正しい方法をとっているかもしれませんが、質問で私が指定したコードでそれを詳しく説明できますか? – Meet

答えて

0

私はあなたがこれを行うことによって達成しようとし、また何が結果として起こることを期待しているのかわかりません。ただし、numbers.Numberabc(抽象基本クラス)なので、abcに登録するだけで、独自のクラスをそのサブクラスの1つに考えることができます。 (私はnumbers.Numberabcだったことを実現していなかったので、私が最初に考えたとして__new__をオーバーライドする必要はありません。)

は、ここで私が何を意味するかです:

import numbers 

class Parent(object): 
    # Added only to make script runnable 
    pass 

class Num(Parent): 
    #Some Code 
    #Here Parent must be inherited 
    pass 

class Foo(Num): 
    #Foo Should return of type numbers.Number 
    #Here Num must be inherited 
    pass 

numbers.Number.register(Foo) 

foo = Foo() 
print(isinstance(foo, numbers.Number)) # -> True 
+0

'numbers.Number。'AttributeError:type object' Number 'に属性' register 'がありません。 – Meet

+0

Python 2.7.13とPython 3.6.0の両方で、私の答えのコードがエラーなく実行されます。何が問題なのか分かりません。 – martineau

0

これは標準class inheritanceによって行うことができます。

from numbers import Number 

class MyNumber(Number): 
    def is_number(self): 
     return isinstance(a, Number) 

a = MyNumber() 
print(a.is_number()) 

numbers moduleのすべてのクラスがAbstract Base Classes(いろは)であることに留意すべきでインスタンス化することはできません。それらは他の言語のインターフェース(Javaのような)に似ており、対応するタイプで実装されています。 intnumbers.Integralを実装しています。

基本クラスとしてnumbers.Numberを使用することにより、あなたはMyNumberにそのクラスからの操作のすべてを持っていますが、あなたはMyNumber(2)のような値とそれをインスタンス化した場合、あなたはTypeError: object() takes no parametersを取得します。

+1

'numbers'モジュールのPEP 3141の[このセクション](https://www.python.org/dev/peps/pep-3141/#numeric-classes)では、抽象的な' Number'クラスは何も提供していないそこから「すべての操作」を継承することはやや意味がないように見えます。私が自分の答えで書いたように、OPが何を求めて何をして達成しようとしているのかははっきりしていません。 – martineau

+0

合意された、質問は不明であり、私の答えは実際にはOPが主として役に立たない間に求めたものの基本的な要件を満たすだけです。 – metame

0

はおそらく、あなたはint型から継承する必要があります。

class MyClass(int): 
    .... 
関連する問題