2012-10-01 94 views
3

我不知道有多少個類實例,因此我需要動態創建它們,但是我也想保持代碼的整潔和可讀性。什麼是動態創建類實例的最有效方式?

我的想法做這樣的:

names = ['Jon','Bob','Mary'] 

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

people = {} 
for name in names: 
    people[name] = Person(name) 

它的工作原理,但我似乎無法找到的人在做這個網上的任何實例(雖然我沒有看多少)。我有什麼理由避免這樣做?如果是這樣,爲什麼和什麼是更好的選擇?

+5

對於我所看到的,您正在討論的是動態創建**對象**而不是**類**,對嗎? –

+0

你的意思是動態創建類實例? –

+3

在上面的代碼中,您不會動態創建任何類,只定義一個類「Person」,然後創建它的三個實例。這是一個完全合法的方式,看不出任何問題。 – bereal

回答

5

如果要動態地創建類的實例,這是你在做什麼你代碼,那麼我認爲你的解決方案看起來非常好,並且是一種pythonic方式(儘管我必須說當然有其他方法)。只是爲了給你一些耐人尋味:你可以註冊/每個新實例存儲與類這樣的:

class Person(): 
    people={} 
    @classmethod 
    def create(cls,name): 
     person=Person(name) 
     cls.people[name]=person 
     return person 
    def __init__(self, name): 
     self.name = name 

如果你正在adventerous,你可以嘗試用元類是相同的,但我會離開這個爲你的研究:-)

3

使用type(name, bases, dict)

From documentation:

返回一個新類型的對象。這實質上是一個動態形式的 類聲明。名稱字符串是類名稱,並且變成名稱屬性的 ;基本元組逐項列出基類,併成爲基的屬性;字典詞典是包含類正文的定義的 命名空間,並且成爲 字典屬性。例如,下面的兩個語句創建相同類型的對象:

>>> class X(object): 
...  a = 1 
... 
>>> X = type('X', (object,), dict(a=1)) 

對於示例:

>>> JonClass = type('JonClass', (object,), {'name': 'Jon'}) 
>>> jon_instance = JonClass() 
>>> jon_instance.name 
'Jon' 
>>> type(jon_instance) 
<class '__main__.JonClass'> 
1

如何使用生成器表達式來創建字典?

people = dict((name, Person(name)) for name in names) 

但除此之外,您的解決方案是完全有效的。

相關問題