标签: setattr

如何在对象中访问私有变量

我想修改一个对象私有变量

class Example():
    __myTest1 = 1
    __myTest2 = 1
    def __init__(self):
        pass
    def modifyTest(self, name = 'Test1', value):
        setattr(self, '__my'+name, value);
Run Code Online (Sandbox Code Playgroud)

我尝试了上面的代码,似乎无法达到私有变量,

AttributeError: Example instance has no attribute '__myTest1'
Run Code Online (Sandbox Code Playgroud)

有没有办法修改私有变量?

python setattr getattr

3
推荐指数
1
解决办法
2752
查看次数

我想在python中创建一个模拟对象

我想要一个虚拟对象,我可以在python中实例化,并以编程方式为via setattr()创建属性.

我在内置对象上尝试了它,但可能是因为一个不起作用的好理由.

我可以在python中使用什么基础对象来实现这样的目的,而不是自己定义一个?

python object setattr

3
推荐指数
1
解决办法
2277
查看次数

TypeError:__class__赋值仅支持堆类型或ModuleType子类

我正在尝试将函数从任意“基”类复制到新对象中。但是,此示例代码出现以下错误。

class my_base:
    def print_hey():
        print("HEY")

    def get_one():
        print(1)

class my_ext:
    def __init__(self, base):
        methods = [method for method in dir(base) if callable(getattr(base, method))]
        for method in methods:
            setattr(self, method, getattr(base, method))


me = my_ext(my_base)
me.get_one()
Run Code Online (Sandbox Code Playgroud)

上面在调用时出现此错误setattr

 TypeError: __class__ assignment only supported for heap types or ModuleType subclasses
Run Code Online (Sandbox Code Playgroud)

如果在定义以上内容后在提示中键入该语句,则该语句有效。

python setattr

3
推荐指数
1
解决办法
1179
查看次数

如何在实例化时动态地将函数添加到python中的实例

如果我有一个python类,它允许在实例化时有一个options参数,我怎样才能根据该options参数的值动态设置一个函数.例如,如果我有代码

def hello1():
    print(self.name,"says hi")

def hello2():
    print(self.name,"says hello")

class A:
    def __init__(self, name, opt=0):
        if opt == 1:
            setattr(self,'hello',hello1)
        else:
            setattr(self,'hello',hello2)

if __name__ == "__main__":
    a1 = A("my")
    a2 = A("name",1)
    a1.hello()
    a2.hello()
Run Code Online (Sandbox Code Playgroud)

我收到了追溯错误

Traceback (most recent call last):
  File "dynamic_classes.py", line 17, in <module>
    a1.hello()
  File "dynamic_classes.py", line 5, in hello2
    print(self.name,"says hello")
NameError: global name 'self' is not defined
Run Code Online (Sandbox Code Playgroud)

python metaprogramming setattr

2
推荐指数
1
解决办法
97
查看次数

可切换的点访问Python dicts?

我还没有看过字典点访问的可切换版本.

我在这里的首次尝试不起作用:

class DottableDict (dict):

    def allowDotting (self, state=True):
        if state:
            self.__setattr__ = dict.__setitem__
            self.__getattr__ = dict.__getitem__
        else:
            del self.__setattr__
            del self.__getattr__

>>> import dot
>>> d = dot.DottableDict()
>>> d.allowDotting()
>>> d.foo = 'bar'
>>> d
{}
>>> d.foo
'bar'
>>> d.__dict__
{'__setattr__': <slot wrapper '__setitem__' of 'dict' objects>, 'foo': 'bar',
'__getattr__': <method '__getitem__' of 'dict' objects>}
>>> d.allowDotting(False)
>>> d.__dict__
{'foo': 'bar'}
Run Code Online (Sandbox Code Playgroud)

我认为签名在setattr和setitem之间不匹配.

我的第二遍也似乎应该有效,但以同样的方式失败:

class DottableDict (dict):

    def dotGet (self, attr):
        return dict.__getitem__(self, attr)

    def dotSet (self, attr, …
Run Code Online (Sandbox Code Playgroud)

python dictionary setattr getattr

2
推荐指数
1
解决办法
1685
查看次数

exec将一个函数添加到一个类中

所以我看了类似的问题,我找到了一些解决方案,但我不知道如何做到这一点.

我想要做的是从字符串向类中添加一个方法.我可以使用该setattr()方法执行此操作,但这不会让我self在额外方法中用作属性.这是一个例子:(我为变量名称道歉,当我嘲笑一个想法时,我总是使用yolo)

class what:
    def __init__(self):
        s = 'def yolo(self):\n\tself.extra = "Hello"\n\tprint self.extra'
        exec(s)
        setattr(self,"yolo",yolo)

what().yolo()
Run Code Online (Sandbox Code Playgroud)

返回:

Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
TypeError: yolo() takes exactly 1 argument (0 given)
Run Code Online (Sandbox Code Playgroud)

如果s = 'def yolo():\n\tself.extra = "Hello"\n\tprint self.extra' 那时我得到这个结果:

Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
  File "<string>", line 2, in yolo
NameError: global name 'self' is not defined
Run Code Online (Sandbox Code Playgroud)

这实际上意味着我不能动态地为类创建方法,我知道这是不好的做法和unpythonic,因为这些方法无法访问类的其余部分可以访问的变量.

我感谢任何帮助.

python exec setattr

2
推荐指数
1
解决办法
2452
查看次数

使用装饰器的动态方法创建者的python setattr

我有一个定义了多个方法的类。

import mat
class Klass(object):

    @mat.sell(mat.CanSet):
    def method1(self):
        return None

    @mat.sell(mat.CanSet):
    def method2(self):
        return 'value2'
Run Code Online (Sandbox Code Playgroud)

假设我有10种方法需要填充此“ Klass”。我想生成这些方法而不显式地编写它们。所以我想做一个为每种方法做setattr的工厂。问题是我遵循以下方法,并且last方法具有最后一个值。每个都没有获得其相关的值,而是value10。另外下面的解决方案没有实现装饰器,我不知道如何分配装饰器

class Klass(object):
    pass

list1 = [('method1', 'value1'), ('method2', 'value2').....('method10', 'value10')]

for each in list1:
    method_name, method_value = each
    setattr(Klass, method_name, lambda self: method_value)
Run Code Online (Sandbox Code Playgroud)

所以当我跟随时...

k = Klass()
print k.method1(), method2()...., method10()
Run Code Online (Sandbox Code Playgroud)

每种方法的结果均为value10。不明白为什么 ?另外,任何人都可以帮助您实现具有一个属性的装饰器吗?附言:如果您有建议不要使用“ setattr”,那也将受到欢迎。

python factory decorator setattr python-decorators

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

你如何在运行时将方法绑定到 python 中的对象?

我想在运行时向对象添加一个方法。

class C(object):
  def __init__(self, value)
    self.value = value

obj = C('test')

def f(self):
  print self.value

setattr(obj, 'f', f)
obj.f()

Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
TypeError: f() takes exactly 1 argument (0 given)
Run Code Online (Sandbox Code Playgroud)

但似乎 setattr 并没有将方法绑定到对象。是否有可能做到这一点?

python monkeypatching setattr

2
推荐指数
1
解决办法
1350
查看次数

作为类的一部分,如何在 Python3 中正确调用 __setattr__()?

我想在设置对象属性时调用函数:

class MyClass():
    myattrib = None

    def __setattr__(self, prop, val):
        self.myattrib = val
        print("setting myattrib")

x = MyClass()
x.myattrib = "something"
Run Code Online (Sandbox Code Playgroud)

问题是,这会产生无限递归。

这个想法是在设置成员变量时调用一个函数(并实际设置该成员变量),但同时运行额外的代码(print()在上面的示例中显示了语句)。

另一个明显的方法是使用set_attrib()函数,这在 Java 中很常见,但我想用pythonic 的方式来做,直接设置属性,但同时运行额外的代码。

python setattr python-3.x

2
推荐指数
1
解决办法
4505
查看次数

在python新样式对象中使用__setattr__时的最大递归深度?

我有以下代码,其中包含一个person类和一个委托给person类的Manager类.我正在使用new style object(派生自object)并运行python 2.7.我认为最大的递归深度是我无法理解的.我知道当使用setattr时会发生问题(当我在经理类中注释掉它时,我发现它工作正常).为什么会发生这种递归以及如何避免它.

class Person(object):
    def __init__(self,name,job=None, pay=0):
        self.name=name
        self.job=job
        self.pay=pay

    def lastName(self):
        return self.name.split()[-1]

    def giveraise(self,percent):
        self.pay=int(self.pay*(1+percent))

    def __str__(self):
        return '[Person: %s, %s]' %(self.name, self.pay)


class Manager(object):
    def __init__(self,name,pay):
        self.person=Person(name,'mgr',pay)

    def giveraise(self, percent, bonus=0.10):
        self.person.giveraise(percent+bonus)

    def __getattr__(self,attr):
        print "calling getattr"
        return getattr(self.person, attr)

    def __setattr__(self,attr, value):
        print "calling setattr"
        self.person__dict__["attr"]=value

    def __str__(self):
        return str(self.person)


if __name__=="__main__":

    sue = Person("sue Jones","dev",10000)
    sue.giveraise(0.10)
    print sue
    print sue.lastName()

    print "- -"*25

    tom = Manager("Tom mandy", …
Run Code Online (Sandbox Code Playgroud)

python class object setattr getattr

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