2012-01-20 4 views
5

matlabでは、以下のようにして構造体配列(struct)を作成できます。クラスを呼び出さずにオブジェクトを作成

person.name = 'Mike'; 
person.age = 25; 
person.gender = 'male'; 

ここでpersonは構造体を作成する前に定義されていません。私はPythonでそれをしようとすると、それは私はPythonでそれをやって、同様の方法がありますエラー

name 'person' is not defined 

いますか?おかげ

EDITは:のpythonに新しいので、私はまだMathWorks社のMATLABで考えます。私が持っている問題は、関数(input1、input2、...、input40)を持つ代わりに、複数の入力(40以上)を取る関数を持っているということです。入力1、入力2、..、入力40からなる。

+1

Matlabのアプローチはほとんど意味がありません。なぜあなたはPythonのようなことをしたいのですか? Pythonの言語規則に従ってPythonで何かをするのが間違っていますか?なぜ異なる言語のルールをPythonに課すのですか? –

+0

こんにちはS.Lott、以下のkindallの回答に関する私のコメントを参照してください。 – mikeP

+0

あなたは本当にPython辞書が必要です –

答えて

6

Pythonは魔法のときにコンテナオブジェクトを作成しませんあなたはそれに属性を割り当てることを開始します。もしmatlabがこれを許せば、私はmatlabがひどく壊れたと考えます。このことを考えてみましょう:

person.name = "Mike" 
persom.age = 25 
person.sex = "Male" 

は、今、私たちは ageを持っていない二つの物体、personpersom、およびpersonを持っており、これが起こったというヒントはありませんでした。後で person.ageを印刷しようとすると、実際に間違った後に2ページが表示されることがあります。

クラス自体をコンテナまたは名前空間として使用できます。それをインスタンス化する必要はありません。属性の束がほしいと思えば、入力する必要はありません。アクセスしたり、これらのいずれかを変更するには

class sex: 
    male = "M" 
    female = "F" 

class person: 
    name = "Mike" 
    age = 25 
    sex = sex.male 

、あなたはなど、person.name

N.B.を使用することができますsexのクラスを使用して、データ値の一貫性を提供しています(「M」か「男性」か「男性」かを覚えていない)し、タイプミスをキャッチしますsex.mlaeについては文字列 "mlae"については後で、それが "男性"に対して後でチェックされた場合は後者は失敗する)。

もちろん、このタイプのクラス定義では、name,age、またはsexのスペルミスが発生する危険性があります。ですから、クラスをテンプレートとして使用してインスタンス化することができます。

class Person: 
    def __init__(self, name, age=None, sex=None): 
     self.name, self.age, self.sex = name, age, sex 

あなたは:

person = Person("Mike", 25, sex.male) 

またはあなたがすべてのそれらのパラメータが何であるかを文書化したい場合:

person = Person("Mike", age=25, sex=sex.male) 

それは、そのオブジェクトで終わるためにほとんど不可能です属性名のスペルが間違っています。あなたがそれを混乱させると、Pythonは間違いを犯した時点でエラーメッセージを表示します。これがこのようにする理由の1つに過ぎません。

+0

あなたの最後の提案が最高です。最後の2番目のものを使用すると、注文を混乱させることができます。 'person = Person(" Mike "、sex.male、25)' –

+0

ありがとうございます。あなたの説明ははっきりと非常に便利です。私はそれが一般的にmatlabで遭遇するエラーであることに同意します。なぜ私は質問をしたのか少し説明することができます。 Pythonに新しいので、私はまだmatlabで考える。私が持っている問題は、関数(input1、input2、...、input40)を持つ代わりに、複数の入力(40以上)を取る関数を持っているということです。入力1、入力2、..、入力40からなる。私のmatlab中心の解決策はPythonでは不可能かもしれないし、私は解決策を考え直さなければならないかもしれない。ありがとう – mikeP

+0

リストに各入力を追加し、リストのインデックスによって各入力値にアクセスすることができます。注文は重要ですが、それは上記のような柔軟な解決策ではありません。 – Michael0x2a

3

あなたはおそらく(ハッシュ、連想配列)の辞書をしたい:Pythonで

person = {'name': 'Mike', 'age': 25} 
7

personは、いくつかのクラスのインスタンスである必要があります。それはただ薄い空気から実現することはできません。

class Struct(object): pass 

person = Struct() 
person.name = 'Mike' 
person.age = 25 
person.gender = 'male' 

print(person.__dict__) 

この版画:

あなたがそうのようにあなたのコードに似たような達成できる

既存のクラスに動的にメンバーを追加することができますPythonでは

{'gender': 'male', 'age': 25, 'name': 'Mike'} 
11

を、その名前を知らなければなりませんいくつかのクラスの型になる。行うにはあなたは空のクラスを作成することがあります。

class Empty: 
    pass  # empty statement otherwise the class declaration cannot succeed 

person = Empty() 

のインスタンスとして、あなたの変数を作成して、あなたが一方

person.name = 'Mike' 
person.age = 25 
person.gender = 'male' 

を好きなデータを追加します「通常の」クラスが提供する追加機能が不要で、キー=>値形式でデータを保存したいだけなら、辞書を使うこともできます。

person={} 
person['name']='Mike' 
person['age']=25 
person['gender']='male' 

(クラスが辞書の観点下に実装されているので、少なくともPythonの2.7まで、これは、大部分だけ文体差であることに気付く)

0

私はNPEやMatteoを推奨していますが、関数はPythonのファーストクラスのオブジェクトなので、空のクラスをエミュレートするためにも使用できますが、複数のオブジェクトとしてインスタンス化することはできません関数ごとに1つのオブジェクトインスタンス)。

>>> def person():pass 
... 
>>> person.name = 'Mike' 
>>> person.name 
'Mike' 
>>> person 
<function person at 0x020CF2F0> 

それは奇妙だので、私はこれを使用することをお勧めしませんが、それは関数をPythonでファーストクラスのオブジェクトであることを示しありません。

関連する問題