2016-03-20 5 views
1

をインスタンス化せずに、私はコンストラクタを持つクラスを定義したと仮定します。パイソン - リターンコンストラクタ引数名

class Person: 

    def __init__(self, name="", age=0): 
     self.__name = name 
     self.__age = age 

今私はPersonのインスタンスを作るのが好き、私は、私は、コンストラクタに渡すべきかを忘れてしまったと仮定します。 私はデフォルト引数を定義しているので、私は新しいPersonを行うことができるように、私は、この時間は、適切な名前と年齢を渡し、引数が何であるかを見てみましょうされます

dummy_person = Person() 
print dummy_person.__init__.__code__.co_varnames 

を行うことができます。

質問は:どのように私はdummy_person最初のインスタンスを作成しなくても同様の結果を達成することができますか?つまり、クラス名を知るだけでコンストラクタの引数リストにアクセスできますか?

編集は:ここで私はこの機能を使用することを計画しています方法です。これが機能するために

args_names = CircleTrajectory.__init__.__code__.co_varnames[1:] 
args = {} 
for arg_name in args_names: 
    args.append(float(input("Insert " + arg_name + ": "))) 

my_circle = CircleTrajectory(*args) 

は、我々は CircleTrajectoryクラスが定義されている必要があり、我々はそのコンストラクタのすべてのパラメータが浮動小数点数であることを前提とする必要があります。最後の前提は私にはあまり魅力がありませんが、GUIに値を入力することでこれらのオブジェクトを最終的なユーザーが作成する必要があるため、安全だと思います。

+1

を使用することができます1つの混乱した解決策のようです。これが影響する完全なユースケースを共有できますか? –

+0

あなたはユーザー入力からインスタンスを作成したい場合は、そのロジックは、(これは修辞的な質問です。答えはイエスである)クラス自体の一部ではないでしょうか?特にあなたが外部から要求された入力の種類を見分けることができないだろうことを考えると、( '' my_circle = CircleTrajectory.from_input())は、クラスメソッド作るのではなく、イントロスペクションの周りfaffing考えてみましょう。 – jonrsharpe

+0

さて、あなたはそれを言いました、確かに!それは実際にはここで全く新しい可能性の世界を開きます。私はまだ疑いが少しあります: 'from_input'メソッドは' @ classmethod'ですか、内部のコンストラクタを呼びますか? – Antonio

答えて

0

ただ、実際のクラスPerson上の同じプロパティにアクセス:

>>> Person.__init__.__code__.co_varnames 
('self', 'name', 'age') 
+0

偉大な、私のために働く!しかし、私は実際にそれが動作することに驚いています。結局、 '__init__'は' @ staticmethod'や '@classmethod'ではありません。それどころか、特定のインスタンスにバインドされています。ここでは、関数呼び出しとしてではなく、コードの一部として '__init__'を扱っていると思います。それ以上の洞察は大切にされます。 – Antonio

+1

@Antonioインスタンスメソッドは、インスタンス化前のクラスにはまだ存在します。 – jonrsharpe

+0

@jonrsharpeが正しいです。結局のところ、 '__init__'は存在していなければならないので、初めてインスタンス化するときに呼び出すことができます。 –

0

あなたはこのように、ここで間違った質問をしているようにそれはそう、それを行うことができますWhleあなたはhelp(Person)またはhelp(Person.__init__)