具体来说,我有一个用户定义的类型的类
class Foo(object):
def __init__(self, bar):
self.bar = bar
def bind(self):
val = self.bar
do_something(val)
我需要:
1)能够调用该类(而不是该类的实例)以恢复self.xxx
该类内定义的所有属性。
对于类的实例,可以通过先执行f = Foo('')
然后再进行来完成f.__dict__
。有没有办法针对一个类而不是一个实例呢?如果是,怎么办?我希望Foo.__dict__
能回来,{'bar': None}
但这种方式行不通。
2)能够访问self.xxx
从类的特定函数调用的所有参数。例如,我想做Foo.bind.__selfparams__
并得到回报['bar']
。有没有办法做到这一点?
假设我正确理解了您要执行的操作,那么使用动态语言很难做到这一点。本质上,这意味着遍历该类存在的所有实例,然后收集这些实例上的所有设置属性。尽管并非不可行,但我将从设计和性能的角度来质疑这种方法的实用性。
更具体地说,您所说的是“类中定义的所有self.xxx属性”,但是这些东西根本没有定义,至少没有在一个地方定义过,它们随着越来越多的课堂变得生动起来。现在,我并不是说您的所有实例都设置了不同的属性,但是它们可能并且为了拥有可靠的通用解决方案,您实际上必须跟踪实例可能对自己所做的任何事情。因此,除非您考虑使用静态分析方法,否则我不会看到一种干净有效的方法(实际上,即使使用动态语言来进行静态分析也无济于事)。
一个简单的例子来证明我的观点:
class Foo(object):
def __init__(self):
# statically analysable
self.bla = 3
# still, but more difficult
if SOME_CONSTANT > 123:
self.x = 123
else:
self.y = 321
def do_something(self):
import random
setattr(self, "attr%s" % random.randint(1, 100), "hello, world of dynamic languages!")
foo = Foo()
foo2 = Foo()
# only `bla`, `x`, and `y` attrs in existence so far
foo2.do_something()
# now there's an attribute with a random name out there
# in order to detect it, we'd have to get all instances of Foo existence at the moment, and individually inspect every attribute on them.
而且,即使您要迭代存在的所有实例,也只会获得您感兴趣的内容的快照,而不是所有可能的属性。
本文收集自互联网,转载请注明来源。
如有侵权,请联系[email protected] 删除。
我来说两句