[英]Calling type(dict) functions within classes on class variables (Python 3.4)
我正在創建一個類,並嘗試定義與在另一個類變量上調用的.keys()或.values()之類的函數相對應的類變量。 例如:
class DATA(object):
def __init__(self, id, database = {}):
self.id = id
self.database = database
self.addresses = database.keys()
self.data = database.values()
這似乎不起作用,因為當我創建類的實例時
foo = DATA(0,{"a":1,"b":2})
然后要求:
print(foo.addresses)
>>> []
並返回一個空列表。
注意:
在我的實際程序中,我從任何類實例的空字典開始,然后在以后使用函數添加到字典中。 在這種情況下,調用“ .database”仍然有效,但“ .addresses”無效。
誰能幫助我解決這個問題?
我不確定這是問題所在,但是使用可變變量(例如{})作為默認參數通常會導致錯誤。 請參閱: “最少驚訝”和可變默認參數
這更安全:
def __init__(self, id, database=None):
if database is None:
self.database = {}
else:
self.database = database
我不了解DATA.addresses和DATA.data的目的。 可以將函數與屬性裝飾器一起使用,以避免冗余嗎?
@property:
def addresses(self):
return self.database.keys()
@property:
def data(self):
return self.database.values()
問題是您正在__init__
方法中直接調用keys
,並保存結果。 您要做的是僅在您要訪問它時才調用keys
。
現在,根據班級的要求,您可能可以通過幾種不同的方式來執行此操作。
如果您不介意公開更改調用代碼,可以使其非常簡單,只需使用foo.database.keys()
而不是foo.addresses
。 后者不需要存在,因為它包含的所有信息已經可以通過databases
屬性的方法獲得。
另一種方法是將綁定的實例方法database.keys
保存到DATA
對象的實例變量(不調用它):
class DATA(object)
def __init__(self, database=None):
if database is None:
database = {}
self.database = database
self.addresses = database.keys # don't call keys here!
在調用代碼中,可以使用foo.addresses()
代替foo.addresses
(一個函數調用,而不僅僅是一個屬性查找)。 盡管實際上不是,但這看起來像是對DATA實例的方法調用。 它在數據庫字典上調用已經綁定的方法。 如果其他代碼可以完全替換database
字典(而不是僅對其進行突變),則這可能會中斷。
最后一種方法是,當用戶嘗試訪問DATA
實例的addresses
屬性時,使用property
來從數據庫字典中請求keys
:
class DATA(object)
def __init__(self, database=None):
if database is None:
database = {}
self.database = database
# don't save anything as "addresses" here
@property
def addresses(self):
return self.database.keys()
這可能是最好的,因為它可以使調用代碼像對待屬性一樣對待addresses
。 如果您完全用其他代碼替換database
對象(例如foo.database = {"foo":"bar"}
),它也將正常工作。 但是,這可能會慢一些,因為會有其他方法不需要的額外函數調用。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.