2012-01-20 151 views
5

在matlab中,我可以通過執行以下操作來創建結構數組(結構體)。在不調用類的情況下創建對象

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

其中person在創建結構之前未被定義。當我嘗試這樣做在巨蟒,它給了我一個錯誤

name 'person' is not defined 

是否有蟒蛇做的一個類似的方式?謝謝

編輯:作爲新的python,我仍然認爲在matlab中。我的問題是我有一個函數需要多個輸入(超過40個),所以不是有函數(input1,input2,...,input40),我只是將函數(input)由input.1,input.2,..,input.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" 

現在我們有兩個對象,personpersom,並person沒有age並沒有暗示這件事發生。後來你試着打印person.age,然後,人們會希望,matlab然後抱怨...實際的錯誤後兩頁。

一個類本身可以用作容器或名稱空間。沒有必要實例化它,如果你只是想要一些屬性,它會爲你節省一些輸入。

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

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

訪問或修改任何這些,你可以使用person.name

注:我使用了一個類sex以說明這樣做的好處之一:它提供了數據值的一致性(不記得您是使用「M」還是「Male」或「male」)並捕獲拼寫錯誤(即Python會抱怨關於sex.mlae,但不是關於字符串「mlae」,如果你後來檢查它反對「男性」,後者將失敗)。

當然,在這種類定義中,仍存在拼寫錯誤name,agesex的風險。所以你可以做的就是使用這個類作爲模板並實例化它。

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會在你犯錯的時候給你一個錯誤信息。這只是這樣做的一個原因。

+0

你最後的建議是最好的。隨着第二個最後一個,你可以搞亂順序,例如'person = Person(「Mike」,sex.male,25)' –

+0

Thanks kindallall。你的解釋清楚而且非常有用。我同意這是matlab中經常遇到的錯誤。如果我可以描述一下爲什麼我問這個問題。作爲python的新手,我仍然在matlab中思考。我的問題是我有一個函數需要多個輸入(超過40個),所以不是有函數(input1,input2,...,input40),我只是將函數(input)由input.1,input.2,..,input.40組成。我的以matlab爲中心的解決方案可能無法在python中實現,我可能不得不重新考慮解決方案。謝謝 – mikeP

+0

您可以嘗試將每個輸入添加到列表中,並通過列表的索引訪問每個輸入值。不過,順序很重要,它不像上述那樣是靈活的解決方案。 – Michael0x2a

3

你可能需要一本字典(哈希,關聯數組):

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

在Python,person必須有一些類的實例;它不能僅憑空氣來實現。

你可以實現像這樣類似代碼的東西:

class Struct(object): pass 

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

print(person.__dict__) 

此打印:

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

在Python中,你可以動態地添加成員到現有的類,但該名稱必須是已知的屬於某一類的類型。要做到這一點,你可以創建一個空的類:

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

構建你的變量作爲它的一個實例

person = Empty() 

,然後添加你想要

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

任何數據。另一方面,如果您不需要「正常」類提供的附加功能,並且您只是希望以key => value的方式存儲某些數據,則可以使用字典。

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

(請注意,至少到的Python 2.7,這通常只是一種風格的區別,因爲類詞典中的條款下實施)

0

雖然我會推薦NPE或Matteo作爲首選方法,因爲函數是python中的第一類對象,它們也可以用來模擬一個空類,但它們不能被實例化爲多個對象(所以你只需要每個函數一個對象實例)。

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

這很奇怪,所以我不會推薦使用這個,但它確實說明函數是python中的第一類對象。

相關問題