标签: setattr

如何在当前模块上调用setattr()?

我作为第一个参数" object"传递给函数setattr(object, name, value),在当前模块上设置变量?

例如:

setattr(object, "SOME_CONSTANT", 42);
Run Code Online (Sandbox Code Playgroud)

产生同样的效果:

SOME_CONSTANT = 42
Run Code Online (Sandbox Code Playgroud)

在包含这些行的模块中(正确object).

我在模块级别动态生成多个值,而我无法__getattr__在模块级别定义,这是我的后备.

python module global-variables setattr getattr

128
推荐指数
3
解决办法
4万
查看次数

如何在python中为类动态创建类方法

如果我定义一个小python程序

class a():
    def _func(self):
        return "asdf"

    # Not sure what to resplace __init__ with so that a.func will return asdf
    def __init__(self, *args, **kwargs):
         setattr(self, 'func', classmethod(self._func))

if __name__ == "__main__":
    a.func
Run Code Online (Sandbox Code Playgroud)

我收到回溯错误

Traceback (most recent call last):
  File "setattr_static.py", line 9, in <module>
    a.func
AttributeError: class a has no attribute 'func'
Run Code Online (Sandbox Code Playgroud)

我想弄清楚的是,如何在不实例化对象的情况下动态地将类方法设置为类?


编辑:

这个问题的答案是

class a():
    pass

def func(cls, some_other_argument):
    return some_other_argument

setattr(a, 'func', classmethod(func))

if __name__ == "__main__":
    print(a.func)
    print(a.func("asdf"))
Run Code Online (Sandbox Code Playgroud)

返回以下输出

<bound method type.func of <class '__main__.a'>> …
Run Code Online (Sandbox Code Playgroud)

python static-methods metaprogramming class setattr

58
推荐指数
2
解决办法
5万
查看次数

在python中使用setattr()

我正在寻找有人解释如何使用的基本知识,而不是使用setattr().

我的问题出现了尝试使用一个类方法/函数来返回数据然后放入另一个方法/函数.在这种情况下,也许更简单的方法会好得多,但我试图理解类的工作原理.这个问题似乎取决于此问题setattr(),这是我试图对此进行相当简单的使用.

虽然它是不太一样的问题,我在下面的Python困难的方法,ex42 -the while环@线18-41.

我尝试编写一个\__init__(),然后用它getattr()来思考可能需要在类的命名空间中的东西,但这似乎没有帮助.

#! /bin/python2.6

class HolyGrail(object):

    def __init__(self):
        self.start = 'start_at_init'

    # function definition in question:
    # TypeError: 'str' object is not callable

    def run_it(self):
        start = setattr(self, 'name', 'get_thing')
        start = self.name

        # Something wrong here?
        value_returned = start() #I believe this == self.get_thing()
        use_it(value_returned)

    """
    # alternate function definitions
    # NameError: global name 'start' is not defined

    def __init__(self):
        self.start = 'get_thing'

    def run_it(self): …
Run Code Online (Sandbox Code Playgroud)

python setattr

54
推荐指数
5
解决办法
14万
查看次数

如何正确使用__setattr__,避免无限递归

我想定义一个包含readwrite方法的类,可以按如下方式调用:

instance.read
instance.write
instance.device.read
instance.device.write
Run Code Online (Sandbox Code Playgroud)

为了不使用隔行扫描类,我的想法是覆盖__getattr____setattr__方法并检查,如果给定的名称是device将返回重定向到self.但是我遇到了一个无限递归的问题.示例代码如下:

class MyTest(object):
    def __init__(self, x):
        self.x = x

    def __setattr__(self, name, value):
        if name=="device":
            print "device test"
        else:
            setattr(self, name, value)

test = MyTest(1)
Run Code Online (Sandbox Code Playgroud)

如在__init__代码中尝试创建一个新属性x,它会调用__setattr__,再次调用__setattr__,依此类推.我怎么需要更改此代码,即,在这种情况下,一个新的属性xself创建,持有的价值1

或者有没有更好的方法来处理像instance.device.read'映射'的调用instance.read

因为总是存在关于原因的问题:我需要创建xmlrpc调用的抽象,为此myxmlrpc.instance,device.read可以创建非常简单的类似方法.我需要'模拟'这样来模仿这样的多点方法调用.

python setattr getattr python-2.7

47
推荐指数
3
解决办法
4万
查看次数

如何在Python中的新样式类上正确覆盖__setattr__和__getattribute__?

我想覆盖我的Python类__getattribute____setattr__方法.我的用例是通常的:我有一些我想要处理的特殊名称,我想要其他任何东西的默认行为.因为__getattribute__,似乎我可以简单地通过提高来请求默认行为AttributeError.但是,我怎样才能实现同样的目标__setattr__呢?这是一个简单的例子,实现了一个具有不可变字段"A","B"和"C"的类.

class ABCImmutable(SomeSuperclass):
    def __getattribute__(self, name):
        if name in ("A", "B", "C"):
            return "Immutable value of %s" % name
        else:
            # This should trigger the default behavior for any other
            # attribute name.
            raise AttributeError()

    def __setattr__(self, name, value):
        if name in ("A", "B", "C"):
            raise AttributeError("%s is an immutable attribute.")
        else:
            # How do I request the default behavior?
            ???
Run Code Online (Sandbox Code Playgroud)

什么代替问号?对于旧式类,答案很明显self.__dict__[name] = value,但文档表明这对于新式类来说是错误的.

python inheritance python-2.x setattr python-3.x

38
推荐指数
2
解决办法
3万
查看次数

嵌套对象上的getattr和setattr?

这可能是一个简单的问题,所以希望有人能够轻易指出我的错误或者这是否可能.

我有一个具有多个对象作为属性的对象.我希望能够动态设置这些对象的属性,如下所示:

class Person(object):
    def __init__(self):
        self.pet = Pet()
        self.residence = Residence()

class Pet(object):
    def __init__(self,name='Fido',species='Dog'):
        self.name = name
        self.species = species

class Residence(object):
    def __init__(self,type='House',sqft=None):
        self.type = type
        self.sqft=sqft


if __name__=='__main__':
    p=Person()
    setattr(p,'pet.name','Sparky')
    setattr(p,'residence.type','Apartment')
    print p.__dict__
Run Code Online (Sandbox Code Playgroud)

输出是:

{'pet':< main .Pet对象位于0x10c5ec050>,'住所':< main .Residence对象位于0x10c5ec0d0>,'pet.name':'Sparky','residence.type':'公寓'}

如您所见,不是在人的宠物对象上设置name属性,而是创建一个新属性"pet.name".

我无法将person.pet指定为setattr,因为不同的子对象将通过相同的方法设置,即解析某些文本并在找到相关键时填写对象属性.

有没有简单/内置的方法来实现这一目标?

或者我可能需要编写一个递归函数来解析字符串并多次调用getattr,直到找到必要的子对象,然后在找到的对象上调用setattr?

谢谢!

python recursion attributes setattr python-2.7

27
推荐指数
4
解决办法
1万
查看次数

python/django中setattr和对象操作之间的区别

我有以下型号:

class Ticket(models.Model):
    title = models.CharField()
    merged_to = models.ForeignKey("self", related_name='merger_ticket', null=True, blank=True)
    looser_ticket = models.BooleanField(default=False)
Run Code Online (Sandbox Code Playgroud)

有几种操作模型的方法:

第一

ticket = Ticket.objects.get(pk=1)
ticket.title = "This is edit title"
ticket.merged_to_id = 2
ticket.looser_ticket = True
Run Code Online (Sandbox Code Playgroud)

第二

ticket = Ticket.objects.get(pk=1)
setattr(ticket, "title", "Edit Title")
setattr(ticket, "merged_to_id", 2)
setattr(ticket, "looser_ticket", True)
Run Code Online (Sandbox Code Playgroud)

当我操作这些东西时,在布尔值更新的视图中,第一种方法不起作用,但第二种方法有效.使用第一个和第二个之间有什么区别,什么时候应该使用它们?

谢谢!

python django django-models setattribute setattr

25
推荐指数
2
解决办法
2万
查看次数

为什么setattr在绑定方法上失败

在下面,setattr第一次调用成功,但在第二次调用失败,有:

AttributeError: 'method' object has no attribute 'i'
Run Code Online (Sandbox Code Playgroud)

为什么会这样,有没有办法在方法上设置属性,使其只存在于一个实例上,而不是存在于每个类的实例中?

class c:

    def m(self):

        print(type(c.m))
        setattr(c.m, 'i', 0)

        print(type(self.m))
        setattr(self.m, 'i', 0)
Run Code Online (Sandbox Code Playgroud)

Python 3.2.2

python methods setattr python-3.x

17
推荐指数
1
解决办法
3976
查看次数

Python:你定义函数__setattr__的方式不一致?

考虑以下代码:

class Foo1(dict):
    def __getattr__(self, key): return self[key]
    def __setattr__(self, key, value): self[key] = value

class Foo2(dict):
    __getattr__ = dict.__getitem__
    __setattr__ = dict.__setitem__

o1 = Foo1()
o1.x = 42
print(o1, o1.x)

o2 = Foo2()
o2.x = 42
print(o2, o2.x)
Run Code Online (Sandbox Code Playgroud)

我期望相同的输出.但是,使用CPython 2.5,2.6(类似于3.2),我得到:

({'x': 42}, 42)
({}, 42)
Run Code Online (Sandbox Code Playgroud)

使用PyPy 1.5.0,我得到了预期的输出:

({'x': 42}, 42)
({'x': 42}, 42)
Run Code Online (Sandbox Code Playgroud)

哪个是"正确的"输出?(或者根据Python文档应该输出什么?)


是CPython的错误报告.

python setattr getattr

15
推荐指数
1
解决办法
692
查看次数

清除方法以在初始化之后禁用`__setattr__`

我写了以下包装类.我想定义__setattr__它将所有属性重定向到包装类.但是,这阻止我初始化包装类.有什么优雅的方法可以解决这个

class Wrapper:
    def __init__(self, value):
        # How to use the default '__setattr__' inside '__init__'?
        self.value = value

    def __setattr__(self, name, value):
        setattr(self.value, name, value)
Run Code Online (Sandbox Code Playgroud)

python setattr python-3.x

15
推荐指数
2
解决办法
3577
查看次数