通常__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)
还不错..
如下面的代码所示,为什么我不能__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) 我有一个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使这更优雅和可读,但我不知道如何.
我听说过setattr和getattr,我想我可以做类似的事情
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!
假设我有以下示例:
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().为此目的,有没有一种好方法可以循环通过所述论点?
我希望保留已定义的参数名称,以便限制传递给函数的参数数量以及传递它们的顺序.我也明白函数可以像对象一样处理 ; 那么有可能获得一个已定义参数的列表作为函数的属性并迭代它吗?
我确实了解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) 我想在初始化之后禁止对类的某些属性进行进一步的赋值.例如; 在初始化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) 下面的代码:
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?所有,
我希望将简单的元信息包含在列表对象中,请参阅下面的代码.
>>> 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)
我的问题是
为什么我不能将setattr()用于变量"a",因为列表应该已经具有' setattr '功能?
是否有一种简单的方法将元信息附加到list/tuple变量而不是重载' setattr '或将该列表嵌入到dict中?
谢谢!
在现有属性递增时调用__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) 我尝试在我的代码中适应良好的 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 ×10
setattr ×10
getattr ×2
list ×2
arguments ×1
class ×1
dry ×1
meta ×1
oop ×1
overloading ×1
parameters ×1
properties ×1
python-2.7 ×1
setattribute ×1