簡體   English   中英

在類變量上的類內調用type(dict)函數(Python 3.4)

[英]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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM