簡體   English   中英

更改以給定字符串開頭的所有 class 屬性的最佳方法是什么?

[英]What is the best way to change all class attributes that start with a given string?

如果 class 屬性是這樣設置的,並且我想更改所有以 DBT 開頭的屬性,那么有沒有辦法在不單獨顯式使用 setattr 的情況下做到這一點?

class AttrTester():
    def __init__(self):
        self.DBTname = "dbt name"
        self.DBTage = "dbt age"
        self.DBTclass = "dbt class"
        self.RCCname = "rcc name"
        self.RCCage = "rcc age"
        self.RCCclass = "rcc class"
    def wipe_dbt(self):
        setattr(self, "DBTname", "None")
        setattr(self, "DBTage", "None")
        setattr(self, "DBTclass", "None")

attr = AttrTester()
attr.wipe_dbt()
print(getattr(attr, "DBTname"))
print(getattr(attr, "DBTage"))
print(getattr(attr, "DBTclass"))

來自評論的解決方案

class AttrTester():
    def __init__(self):
        self.DBTname = "dbt name"
        self.DBTage = "dbt age"
        self.DBTclass = "dbt class"
        self.RCCname = "rcc name"
        self.RCCage = "rcc age"
        self.RCCclass = "rcc class"
    def wipe_dbt(self):
        for attrib in dir(self):
            if attrib.startswith("DBT"):
                setattr(self, attrib, "None")

attr = AttrTester()
attr.wipe_dbt()
print(getattr(attr, "DBTname"))
print(getattr(attr, "DBTage"))
print(getattr(attr, "DBTclass"))

首先,最好正確地說“實例屬性”,因為它們綁定到實例(自身)而不是 class。

我假設您要做的是獲取任何以"DBT"開頭的實例屬性並將new_value設置為它。

class AttrTester():
    def __init__(self):
        self.DBTname = "dbt name"
        self.DBTage = "dbt age"
        self.DBTclass = "dbt class"
        self.RCCname = "rcc name"
        self.RCCage = "rcc age"
        self.RCCclass = "rcc class"

    def wipe_dbt(self, new_value):
        for k in self.__dict__:
            if k.startswith('DBT'):
                self.__dict__[k] = new_value


attr = AttrTester()
attr.wipe_dbt(None)
print(getattr(attr, "DBTname"))
print(getattr(attr, "DBTage"))
print(getattr(attr, "DBTclass"))

這是一種相當通用的方法:

class AttrTester():
    def __init__(self):
        self.DBTname = "dbt name"
        self.DBTage = "dbt age"
        self.DBTclass = "dbt class"
        self.RCCname = "rcc name"
        self.RCCage = "rcc age"
        self.RCCclass = "rcc class"

    def wipe_attr(self, prefix, value=None):
        for name, attr in self.__dict__.items():
            if name.startswith(prefix):
                setattr(self, name, value)

attr = AttrTester()
attr.wipe_attr('DB')
print(getattr(attr, "DBTname"))
print(getattr(attr, "DBTage"))
print(getattr(attr, "DBTclass"))

如果您願意,也可以將其設為單獨的 function:

class AttrTester():
    def __init__(self):
        self.DBTname = "dbt name"
        self.DBTage = "dbt age"
        self.DBTclass = "dbt class"
        self.RCCname = "rcc name"
        self.RCCage = "rcc age"
        self.RCCclass = "rcc class"

def wipe_attr(obj, prefix, value=None):
    for name, attr in obj.__dict__.items():
        if name.startswith(prefix):
            setattr(obj, name, value)

testobj = AttrTester()
wipe_attr(testobj, 'DB')
print(getattr(testobj, "DBTname"))
print(getattr(testobj, "DBTage"))
print(getattr(testobj, "DBTclass"))

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

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