更改以给定字符串开头的所有类属性的最佳方法是什么?

2024-05-29 02:48:50 发布

您现在位置:Python中文网/ 问答频道 /正文

如果类属性是这样设置的,并且我想更改以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"))

Tags: selfnone属性defdbtclassattrprint
3条回答

以下是一种相当通用的方法:

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"))

如果您愿意,也可以将其作为单独的功能:

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"))

来自评论的解决方案

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"))

首先,最好正确地说“实例属性”,因为它们绑定到实例(自身)而不是类

我假设您要做的是获取任何以"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"))

相关问题 更多 >

    热门问题