如何在Python中动态创建类变量

dbf7pr2w  于 2023-05-27  发布在  Python
关注(0)|答案(7)|浏览(171)

我需要创建一堆类变量,我想通过像这样的列表循环来实现:

vars=('tx','ty','tz') #plus plenty more

class Foo():
    for v in vars:
        setattr(no_idea_what_should_go_here,v,0)

可能吗?我不想把它们作为示例(在__init__中使用self),而是作为类变量。

k75qkfdt

k75qkfdt1#

您可以在创建类后立即运行插入代码:

class Foo():
     ...

vars=('tx', 'ty', 'tz')  # plus plenty more
for v in vars:
    setattr(Foo, v, 0)

此外,您可以在创建类时动态存储变量:

class Bar:
    locals()['tx'] = 'texas'
rqenqsqc

rqenqsqc2#

迟到的聚会,但使用type类构造函数!

Foo = type("Foo", (), {k: 0 for k in ("tx", "ty", "tz")})
nqwrtyyt

nqwrtyyt3#

如果由于某种原因,你不能使用Raymond的答案,在类创建之后设置它们,那么也许你可以使用元类:

class MetaFoo(type):
    def __new__(mcs, classname, bases, dictionary):
        for name in dictionary.get('_extra_vars', ()):
            dictionary[name] = 0
        return type.__new__(mcs, classname, bases, dictionary)

class Foo(): # For python 3.x use 'class Foo(metaclass=MetaFoo):'
    __metaclass__=MetaFoo # For Python 2.x only
    _extra_vars = 'tx ty tz'.split()
4bbkushb

4bbkushb4#

locals()版本在一堂课上对我不起作用。
以下内容可用于动态创建类的属性:

class namePerson:
    def __init__(self, value):
        exec("self.{} = '{}'".format("name", value)

me = namePerson(value='my name')
me.name # returns 'my name'
eqfvzcg8

eqfvzcg85#

setattr(object, name, value)这是getattr()的对应项。参数是一个对象、一个字符串和一个任意值。字符串可以命名现有属性或新属性。如果对象允许,函数将值赋给属性。例如,setattr(x, 'name', value)等价于x.name = value

laximzn5

laximzn56#

你需要的函数是:
setattr(obj, name, value)
这允许您为给定的类设置命名属性(可以是self)。
此函数的内置文档非常简单:

Signature: setattr(obj, name, value, /)
Docstring:
Sets the named attribute on the given object to the specified value.

setattr(x, 'y', v) is equivalent to ``x.y = v''
Type:      builtin_function_or_method

使用示例

它的一个用途是使用字典来设置多个类属性,在我的例子中,这是从 xpath 定义。我觉得这样做提高了可维护性,因为它将可能更脆弱的XPath定义都放在了一个地方:

class Person:
    def _extract_fields(self):
        ''' Process the page using XPath definitions '''
        logging.debug("_extract_fields(): {}".format(repr(self)))
        # describe how to extract data from the publicly available site
        # (kept together for maintainability)
        fields = {
            'staff_name':
            '//div[@id="staff_name"]//text()',
            'staff_dob':
            '(//div[@id="staff_dob"]//text())[1]'
        }
        # populate named class attributes from the dict
        for key in fields:
            setattr(self, key, self._parsed_content.xpath(fields[key]))

    def __init__(self):
        self._extract_fields()
bt1cpqcv

bt1cpqcv7#

你可以在名字的开头使用“foo.”(或者你的类名)来创建全局变量:

vars=('tx','ty','tz') #plus plenty more

class Foo():
    pass

foo = Foo() # Instance the class

for i in vars:
    globals () ["foo." + i] = value

相关问题