2014-01-28 69 views
1

我試圖初始化使用kwargs的對象和我用下面的代碼:Python的初始化對象與kwargs

class A: 
    def __init__(self, **kwargs): 
     self.__dict__.update(kwargs) 
    def __repr__(self): 
     return "A('%s', '%s', '%s')" % (self.name, self.age, self.address) 


a = A(name="J Smith", age=20, address ="New York") 
b = A(name="B Jones", age=40, address = "Chicago") 

我用這種方法目前的問題是,它似乎使用kwargs而非更新要慢得多變量(即a.name =「J Smith」,a.age = 20)而不是將它們作爲字典傳遞。在我初始化'b'後,我發現實例'a'的屬性已被'b'的屬性覆蓋。有沒有什麼我在這裏做錯了和/或有一個我失蹤的步驟?

+1

_「我發現實例'a'的屬性已被'b'的屬性覆蓋。」_這不會發生在我的機器上。你能發表一些代碼來證明你的問題嗎?現在,你有一些語法錯誤。 – Kevin

+0

需要更多的信息.​​..如果你使用'A.name =「J Smith」',你將設置一個_class_變量,而不是_instance_變量。 –

+0

在Python 3.2.2中運行這段代碼,我看不到緩慢或屬性覆蓋。你能複製/粘貼一個顯示問題的Python會話嗎? –

回答

1

與手動設置每個變量相比,使用** kwargs更新類的速度幾乎是原來的兩倍。但是,兩個單獨的類對象彼此重寫應該沒有問題。參考:

import timeit 

class A: 
    def __init__(self, **kwargs): 
     self.__dict__.update(kwargs) 

class B: 
    def __init__(self, **kwargs): 
     for k, v in kwargs.items(): 
      setattr(self, k, v) 

class C: 
    def __init__(self, name, age): 
     self.name = name 
     self.age = age 

def initialize_class_a(): 
    a = A(name="J Smith", age=20) 
    b = A(name="B Jones", age=40) 
    return a.name, b.name 

def initialise_class_b(): 
    a = B(name="J Smith", age=20) 
    b = B(name="B Jones", age=40) 
    return a.name, b.name 

def initialise_class_c(): 
    a = C(name="J Smith", age=20) 
    b = C(name="B Jones", age=40) 
    return a.name, b.name 

print(initialize_class_a()) 
# ('J Smith', 'B Jones') 
print(initialise_class_b()) 
# ('J Smith', 'B Jones') 
print(initialise_class_c()) 
# ('J Smith', 'B Jones') 

print(timeit.timeit("initialize_class_a()", "from __main__ import initialize_class_a")) 
# 1.93 
print(timeit.timeit("initialise_class_b()", "from __main__ import initialise_class_b")) 
# 2.19 
print(timeit.timeit("initialise_class_c()", "from __main__ import initialise_class_c")) 
# 1.03 

請注意,在每個運行兩個單獨的類對象,a.name和b.name的名字,仍然報告是不同的。

+0

謝謝,是的,它仍然是較慢,但不是很多,是的,現在的情況是不同的。我剛剛在代碼中的其他地方發現了一個bug,我不小心把它歸因於使用kwargs,這段代碼和上面的註釋有助於澄清這一點,非常感謝! – Lezan

+0

沒問題,很高興你明白了!在提到kwargs較慢之後,我想親自看看,因此對我來說這也是一次很好的學習體驗。 – CasualDemon