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()
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
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()
7条答案
按热度按时间k75qkfdt1#
您可以在创建类后立即运行插入代码:
此外,您可以在创建类时动态存储变量:
rqenqsqc2#
迟到的聚会,但使用
type
类构造函数!nqwrtyyt3#
如果由于某种原因,你不能使用Raymond的答案,在类创建之后设置它们,那么也许你可以使用元类:
4bbkushb4#
locals()
版本在一堂课上对我不起作用。以下内容可用于动态创建类的属性:
eqfvzcg85#
setattr(object, name, value)
这是getattr()
的对应项。参数是一个对象、一个字符串和一个任意值。字符串可以命名现有属性或新属性。如果对象允许,函数将值赋给属性。例如,setattr(x, 'name', value)
等价于x.name = value
。laximzn56#
你需要的函数是:
setattr(obj, name, value)
这允许您为给定的类设置命名属性(可以是
self
)。此函数的内置文档非常简单:
使用示例
它的一个用途是使用字典来设置多个类属性,在我的例子中,这是从 xpath 定义。我觉得这样做提高了可维护性,因为它将可能更脆弱的XPath定义都放在了一个地方:
bt1cpqcv7#
你可以在名字的开头使用“foo.”(或者你的类名)来创建全局变量: