2015-10-14 13 views
0

因此,我環顧四周,閱讀了許多覆蓋TypeError的消息,其中「完全使用X參數,但只給出1」 。我知道self。我不認爲我有一個問題了解self。無論如何,我試圖創造一些屬性的類只要我在函數hwaddr前面有@property,我得到以下錯誤:TypeError:function())使用@property完全接受X參數(1給出)decorator

Traceback (most recent call last): 
    File line 24, in <module> 
    db.hwaddr("aaa", "bbbb") 
TypeError: hwaddr() takes exactly 3 arguments (1 given) 

這裏是代碼。爲什麼@property搞砸了我?我把它拿出來,和代碼按預期工作:

#!/usr/bin/env python2.7 

class Database: 
    """An instance of our Mongo systems database""" 

    @classmethod 
    def __init__(self): 
     pass 

    @property 
    def hwaddr(self, host, interface): 

     results = [ host, interface ] 
     return results 

db = Database() 
print db.hwaddr("aaa", "bbbb" 

Process finished with exit code 1 

有了它走了,輸出是:

File 
['aaa', 'bbbb'] 

Process finished with exit code 0 

回答

2

屬性作爲語法糖干將。所以他們希望你只有self。它基本上會縮短:

print db.hwaddr() 

到:

print db.hwaddr 

沒有必要爲你傳遞兩個參數在這裏使用一個屬性

+0

是的,我現在看到。謝謝。我會接受這個答案。我的困惑是出於吸氣的目的。在這裏,我沒有得到一個對象變量......我也沒有在編寫真正的代碼。 –

1

基本上,代爾說:性別不需要參數,那是什麼方法。

通常情況下,你會希望在下列情況下使用性質:

  • 提供只讀到內部屬性
  • 訪問要實現計算字段
  • 提供讀/寫訪問到一個屬性,但控制當它被設置時會發生什麼

所以問題是,hwaddr做什麼,並且它匹配任何這些用例?主機和接口究竟是什麼?我想你要做到這一點是:

#!/usr/bin/env python2.7 

class Database: 
    """An instance of our Mongo systems database""" 

    def __init__(self, host, interface): 
     self._host = host 
     self._interface = interface 

    @property 
    def host(self): 
     return self._host 

    @property 
    def interface(self): 
     return self._interface 

    @property 
    def hwaddr(self): 
     return self._host, self._interface 

db = Database("my_host", "my_interface") 
print db.host 
print db.interface 
print db.hwaddr 

在這裏,您數據庫類將有主機接口只讀屬性,只能被實例化類時設置。第三個屬性hwaddr將產生一個帶有數據庫完整地址的元組,這在某些情況下可能會很方便。

另外,請注意,我刪除了classmethod修飾器init;構造函數應該是實例方法。

+0

感謝您的回覆;很有幫助。* host *是一個字符串,* interface *是一個帶有數字字典的字典;每個鍵都是一個字符串,每個值都是一個字典(例如:eth0接口的「管理」)。每個THOSE字典都有字符串/字符串的鍵/值對;密鑰包括「hwaddr」,「ip」和「defaultgw」。因此,如果我們在主機上更改網卡的特定接口名稱,則可以動態修改hwaddr。它不符合財產的標準。 –

+0

關於'classmethod'裝飾器:_init__沒有它是有意義的。我把它放在那裏的原因是因爲在我的腳本中總是隻有一個Database類的實例。在我的例子中沒有看到數據庫的* host,port,user,*和* password *變量(忘記當前的安全隱患)。在'__init__'中,我根據這些值建立了連接。你將如何構造一個類,然後使用1個且只有1個實例? (也許我不在乎,因爲沒有技術限制,限制我只有1個連接到數據庫...? –

+0

單身模式被許多人皺起了眉頭。但是如果你想實現它,你可以在Python中找到很多關於它的最佳方法的討論和例子:http://stackoverflow.com/questions/6760685/creating-a-singleton-in-python –

相關問題