标签: setattr

参数上的Python __init__ setattr?

通常__init__方法似乎与此类似:

def __init__(self, ivar1, ivar2, ivar3):
    self.ivar1 = ivar1
    self.ivar2 = ivar2
    self.ivar3 = ivar3
Run Code Online (Sandbox Code Playgroud)

有没有办法将参数转换为一个列表(不使用*args**kwargs),然后使用setattr设置实例变量,参数名称和参数传递?也许可以对列表进行切片,例如,您需要至少将其切片,[1:]因为您不需要self.self.

(实际上我想它需要是一个字典来保存名称和值)

像这样:

def __init__(self, ivar1, ivar2, ivar3, optional=False):
    for k, v in makedict(self.__class__.__init__.__args__): # made up __args__
        setattr(self, k, v)
Run Code Online (Sandbox Code Playgroud)

谢谢!

回应未知的答案,我发现这个工作:

Class A(object):
    def __init__(self, length, width, x):
        self.__dict__.update(dict([(k, v) for k, v in locals().iteritems() if k != 'self']))
Run Code Online (Sandbox Code Playgroud)

要么

Class A(object):
    def __init__(self, length, width, x):
        self.__dict__.update(locals())
        del self.__dict__['self']
Run Code Online (Sandbox Code Playgroud)

还不错..

python parameters initialization list setattr

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

Python,如何在属于重载方法的类的字典对象上使用 __setattr__ ?

如下面的代码所示,为什么我不能__setattr__在属于重载该方法的类的字典上设置值?我预计那b.hello不会存在。

class MyClass():

    datastore = {}

    def __init__(self):
        self.datastore = {}

    def __getattr__(self, key):
        return self.datastore[key]

    def __setattr__(self, key, value):
        self.datastore[key] = value

a = MyClass()
b = MyClass()

a.hello = "err"

print a.hello # err
print b.hello # err
Run Code Online (Sandbox Code Playgroud)

python setattr python-2.7

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

setattr和getattr方法

我有一个boiler platey类,它将一些操作委托给引用类.它看起来像这样:

class MyClass():

    def __init__(self, someClass):            
        self.refClass = someClass

    def action1(self):
        self.refClass.action1()

    def action2(self):
        self.refClass.action2()

    def action3(self):
        self.refClass.action3()
Run Code Online (Sandbox Code Playgroud)

这是refClass:

class RefClass():

    def __init__(self):
        self.myClass = MyClass(self)

    def action1(self):
        #Stuff to execute action1

    def action2(self):
        #Stuff to execute action2

    def action3(self):
        #Stuff to execute action3
Run Code Online (Sandbox Code Playgroud)

我想使用Python Metaprogramming使这更优雅和可读,但我不知道如何.

我听说过setattrgetattr,我想我可以做类似的事情

class MyClass():

    def __init__(self, someClass):            
        self.refClass = someClass

    for action in ['action1', 'action2', 'action3']:
        def _delegate(self):
            getattr(self.refClass, action)()
Run Code Online (Sandbox Code Playgroud)

然后我知道我需要从某个地方做这个,我想:

MyClass.setattr(action, delegate)
Run Code Online (Sandbox Code Playgroud)

我无法完全掌握这个概念.我理解不重复代码的基础知识,并使用带有函数编程的for循环生成方法,但后来我不知道如何从其他地方调用这些方法.Heeeelp!

python metaprogramming dry setattr getattr

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

Python - 迭代传递给函数的参数

假设我有以下示例:

class foo:
   ...
   def bar(self, w, x, y, z, ...):
      self.w = w
      self.x = x
      self.y = y
      self.z = z
      ...
Run Code Online (Sandbox Code Playgroud)

我希望通过参数循环将n个属性赋值行减少bar()到一个赋值行集setattr().为此目的,有没有一种好方法可以循环通过所述论点?

我希望保留已定义的参数名称,以便限制传递给函数的参数数量以及传递它们的顺序.我也明白函数可以像对象一样处理 ; 那么有可能获得一个已定义参数的列表作为函数的属性并迭代它吗?

python arguments variable-assignment setattr

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

Python setattr()函数采用初始函数名称

我确实了解setattr()python的工作原理,但是我的问题是当我尝试动态设置属性并将其未绑定函数作为值提供时,因此该属性是可调用的,当我使用该属性时,该属性最终会使用未绑定函数的名称调用attr.__name__,而不是属性的名称。

这是一个例子:

我有一Filter堂课:

class Filter:
    def __init__(self, column=['poi_id', 'tp.event'], access=['con', 'don']):
        self.column = column
        self.access = access
        self.accessor_column = dict(zip(self.access, self.column))
        self.set_conditions()

    def condition(self, name):
        # i want to be able to get the name of the dynamically set 
        # function and check `self.accessor_column` for a value, but when
        # i do `setattr(self, 'accessor', self.condition)`, the function 
        # name is always set to `condition` rather than `accessor`
        return name

    def set_conditions(self):
        mapping = list(zip(self.column, …
Run Code Online (Sandbox Code Playgroud)

python class setattribute setattr dynamic-function

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

如何限制在构造函数之外设置属性?

我想在初始化之后禁止对类的某些属性进行进一步的赋值.例如; 在初始化Person实例'p'之后,没有人能够明确地将任何值分配给'ssn'(社会安全号码)属性._ SETATTR _而分配中的数值也被称为_ INIT _方法,因此它是不是我想要的.我想仅限制进一步的作业.我怎样才能做到这一点?

class Person(object):
    def __init__(self, name, ssn):
        self.name = name
        self._ssn = ssn

    def __setattr__(self, name, value):
        if name == '_ssn':
            raise AttributeError('Denied.')
        else:
            object.__setattr__(self, name, value)

>> p = Person('Ozgur', '1234')
>> AttributeError: Denied.
Run Code Online (Sandbox Code Playgroud)

python variable-assignment setattr

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

为什么 __setattr__ 的“name”参数包含该类,而 __getattr__ 不包含该类?

下面的代码:

class MyClass():
    def test(self):
        self.__x = 0

    def __setattr__(self, name, value):
        print name

    def __getattr__(self, name):
        print name
        raise AttributeError(name)

x = MyClass()
x.test()
x.__y
Run Code Online (Sandbox Code Playgroud)

输出:

_MyClass__x
__y
Traceback (most recent call last):
...
AttributeError: __y
Run Code Online (Sandbox Code Playgroud)

该文档完全没有帮助说明“名称”是“属性的名称”,但由于某种原因,它会有所不同,具体取决于您是设置它还是获取它。

我想知道的是:

  • 我在这里做的是根本错误的事情吗?
  • 我如何进入x第一种情况而不是_MyClass__x

python setattr getattr

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

需要一个简单的方法将元信息/类添加到python列表/元组变量?

所有,

我希望将简单的元信息包含在列表对象中,请参阅下面的代码.

>>> a = []
>>> a.foo = 100
Traceback (most recent call last):
  File "<interactive input>", line 1, in <module>
AttributeError: 'list' object has no attribute 'foo'
>>> setattr(a,"foo",100)
Traceback (most recent call last):
  File "<interactive input>", line 1, in <module>
AttributeError: 'list' object has no attribute 'foo'
>>> dir(a)
...
 '__setattr__',
 '__setitem__',
...
Run Code Online (Sandbox Code Playgroud)

我的问题是

  1. 为什么我不能将setattr()用于变量"a",因为列表应该已经具有' setattr '功能?

  2. 是否有一种简单的方法将元信息附加到list/tuple变量而不是重载' setattr '或将该列表嵌入到dict中?

谢谢!

python meta list setattr

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

在现有属性递增时调用__setattr__?

在现有属性递增时调用__setattr__?

我有一个名为C的类,我正在尝试重载__setattr__.这是C类内部的一段代码:

class C:

    def bump(self):
        self.a += 1
        self.b += 1
        self.c += 1

    def __setattr__(self,name,value):
        calling = inspect.stack()[1]
        if 'private_' in name:
            raise NameError("\'private_\' is in the variable name.")
        elif '__init__' in calling.function:
            self.__dict__['private_' + name] = value
        elif name.replace('private_', '') in self.__dict__:
            if self.in_C(calling):
                if name.replace('private_', '') in self.__dict__.keys():
                    old_value = self.__dict__[name.replace('private_', '')]
                    new_value = old_value + value
                    self.__dict__[name.replace('private_', '')] = new_value
                else:
                    self.__dict__[name.replace('private_','')] = value
            else:
                raise NameError()
        else:
            self.__dict__[name] = value …
Run Code Online (Sandbox Code Playgroud)

python overloading setattr

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

setattr 是否调用属性 setter func?

我尝试在我的代码中适应良好的 oop 行为,并且想知道以下内容:

我一般有这样的类设计:

class MyClass():
    def __init__(self,arg1):
        self.arg1 = arg1

    @property
    def arg1(self):
        return _arg1

    @arg1.setter
    def arg1(self, value):
        self._arg1 = value
Run Code Online (Sandbox Code Playgroud)

如果我现在编写一个具有字典并使用该字典来设置类属性的函数:

    def set_my_dict(self):
        argdict = {'arg1':4}
        for k, v in argdict:
            setattr(self, k, v)
Run Code Online (Sandbox Code Playgroud)

setattr在这种情况下,这是否会调用设置器来进行可能的类型检查等?

python oop properties setattr

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