2016-12-16 22 views
-1

クラス/ __init__属性のリストを1つのオブジェクトなしで取得する関数はありますか?クラス属性の名前を関数に渡す必要があります。私は何時間も解決策を探そうとしましたが、ほとんどの場合、x = ClassName()のようなsthを使用する必要があります。私の場合はエラーが発生します(例えば、__init__()は6つの引数をとります)。たとえば :インスタンス属性のリストを取得する方法

list_of_attr = ['name', 'year', 'color'] 

それも可能です:

class Car: 
    def __init__(self, name, year, color): 
     self.name = name 
     self.year = year 
     self.color = color 

は、どのように私のようなリストが入手できますか?

編集: 私の質問にいくつかのコンテキストを追加する - テキストファイルからデータを取得し、オブジェクトのリストに変換する関数を作成しようとしています。ファイルの各行には、1つのオブジェクトのデータが含まれています。 'Volvo、1995、blue'。 私は今2つのクラスと2つのファイルを持っていますが(もっと期待しています)、私は既に実用的なソリューションを作っていますが、今はオブジェクト/インスタンス属性の名前を関数にあらかじめ記述されたリストで渡す必要があります。クラス名だけに基づいて自動的に実行されるようにします。

+2

この

class Car: def __init__(self, name="default", year=1995, color="red"): self.name = name self.year = year self.color = color members = [mems for mems in dir(Car()) if not callable(mems) and not mems.startswith("__")] print members 

を見て "それも可能ですか?"これらはインスタンス属性であり、クラス属性ではないためです。 – DeepSpace

+1

これらは* class *の属性ではなく、* instance *です。あなたが解決しようとしている実際の問題は何ですか? – jonrsharpe

+0

ところで、Python 2では、クラスは明示的に 'object'から継承する必要があります。、 'class Car(object):'そうでなければ古いスタイルのクラスを取得します。 Python 3では、すべてのクラスが新しいスタイルですが、その構文を使用することができます。これは、両方のバージョンで動作するコードを作成する場合に便利です。 –

答えて

3

あなたのクラスにはクラス属性はまったくありません。 __init__メソッドではインスタンス属性がに設定されているため、インスタンスが作成され、実際には__init__が実行された後にのみそれらの名前にアクセスできます。

この時点で、vars() functionを使用してインスタンスの名前空間を取得できます。あなたが鍵を得ることができるので、これは、あなたの辞書を与える:

vars(x).keys() 

あなたは何引数を探していた場合は__init__方法は、あなたが署名をイントロスペクトするinspect.getargspec()を使用することができます期待しています。これにより、すべての引数の名前とデフォルトの値(キーワード引数など)が得られます。このことから、あなたは必要(位置)引数の数を推測することができます。これは、バインドされたメソッドのために自動的に渡されたself引数が含まれます

import inspect 

argspec = inspect.getargspec(Car.__init__) 
required = argspec.args 
if argspec.defaults: 
    required = required[:-len(argspec.defaults)] 

を。あなたは、スライスしてその最初の引数を無視することができます。

method_required = argspec.args[1:] 
if argspec.defaults: 
    method_required = method_required[:-len(argspec.defaults)] 

デモ:要するに

>>> import inspect 
>>> class Car: 
...  def __init__(self, name, year, color): 
...   self.name = name 
...   self.year = year 
...   self.color = color 
... 
>>> vars(Car('Volvo', 1975, 'blue')) 
{'color': 'blue', 'name': 'Volvo', 'year': 1975} 
>>> vars(Car('Volvo', 1975, 'blue')).keys() 
['color', 'name', 'year'] 
>>> inspect.getargspec(Car.__init__) 
ArgSpec(args=['self', 'name', 'year', 'color'], varargs=None, keywords=None, defaults=None) 
1

を、それは不可能です。メモリを作成せずにメンバー変数を取得することはできません(つまり、オブジェクトを作成する必要があります)。これに代わる方法がありますが、__init__()メソッドのデフォルト値が必要です。出力

['color', 'name', 'year'] 
+0

私は本当にあなたの答えが好きです。私は私のインスタンスのデフォルト値で暮らすことができると思う。私はそれを少し変更してメソッドを除外しました。(私は私の質問には何も入れていませんでした): '' mem {{mem}} '' mems.startswith( "__")] ' – 10ok

+0

良い修正@ 10okのように見える、ありがとう! –

+0

私はその解決策に問題があります。それは非常に望ましくない名前を自動的にソートします。 – 10ok

関連する問題