我作为第一个参数" 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程序
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) 我正在寻找有人解释如何使用的基本知识,而不是使用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) 我想定义一个包含read
和write
方法的类,可以按如下方式调用:
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__
,依此类推.我怎么需要更改此代码,即,在这种情况下,一个新的属性x
的self
创建,持有的价值1
?
或者有没有更好的方法来处理像instance.device.read
'映射'的调用instance.read
?
因为总是存在关于原因的问题:我需要创建xmlrpc
调用的抽象,为此myxmlrpc.instance,device.read
可以创建非常简单的类似方法.我需要'模拟'这样来模仿这样的多点方法调用.
我想覆盖我的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
,但文档表明这对于新式类来说是错误的.
这可能是一个简单的问题,所以希望有人能够轻易指出我的错误或者这是否可能.
我有一个具有多个对象作为属性的对象.我希望能够动态设置这些对象的属性,如下所示:
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?
谢谢!
我有以下型号:
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)
当我操作这些东西时,在布尔值更新的视图中,第一种方法不起作用,但第二种方法有效.使用第一个和第二个之间有什么区别,什么时候应该使用它们?
谢谢!
在下面,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
考虑以下代码:
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的错误报告.
我写了以下包装类.我想定义__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 ×10
setattr ×10
getattr ×3
python-3.x ×3
python-2.7 ×2
attributes ×1
class ×1
django ×1
inheritance ×1
methods ×1
module ×1
python-2.x ×1
recursion ×1
setattribute ×1