'Python 对象方法调用'

2024-10-02 12:28:28 发布

您现在位置:Python中文网/ 问答频道 /正文

我需要一个包含处理程序列表的类实例变量(这个类实例的指定方法)。处理程序列表可根据要求提供。在

我有两种解决办法,但都不适合我。在

  1. http://www.ideone.com/3aSkT-您将得到一个循环引用。GC可以清理它,但我们不知道什么时候。在
  2. http://www.ideone.com/OaP5c-在这里,当您调用时,您需要显式地将类的实例传递给函数。在

还有其他建议吗?在


Tags: 实例方法函数comhttp处理程序列表www
3条回答

扩展了@mac的答案,考虑到OP请求一个类实例变量,并且他可能还想获得关于“private”方法的信息:

In [5]: class Foo(object):
   ...:     def m1(self):pass
   ...:     def m2(self):pass
   ...:
In [6]: f = Foo()
In [7]: lst = dir(f)
In [8]: [m for m in lst if not m.endswith('__')]
Out[8]: ['m1', 'm2']

如果需要对象方法:

^{pr2}$

或者直接在列表中从实例中理解:

In [18]: [getattr(f, m) for m in lst if not m.endswith('__')]
Out[18]:
[<bound method Foo.m1 of <__main__.Foo object at 0x00000000073DD1D0>>,
 <bound method Foo.m2 of <__main__.Foo object at 0x00000000073DD1D0>>]

编辑:那么,根据你在链接中给出的例子,也许你在寻找类似的东西:

class SomeClass:

    store = {0: 'someMethod', 1: 'someMethod1'}

    def __init__(self):
        print('__init__')

    def __del__(self):
        print('__del__')

    def get_dict(self):
        return [getattr(self, att) for idx, att in SomeClass.store.items()]

    def someMethod(): pass
    def someMethod1(): pass


f = SomeClass()
print f.get_dict()

打印出:

__init__
[<bound method SomeClass.someMethod of <__main__.SomeClass instance at 0x0000000
0026E2E08>>, <bound method SomeClass.someMethod1 of <__main__.SomeClass instance
 at 0x00000000026E2E08>>]
__del__

我不确定是否理解您的问题,但是如果您想将方法名“映射”到其他方法(调用Foo().store()实际上会调用Foo().someMethod()),而不引用它们,则可以通过重写默认的object.__getattribue__行为来实现这一点。在

class Foo(object):
    mapping = {'store': 'someMethod'}

    def __getattribute__(self, attr):
        try:
            # first check if it's a "regular" attribute/method
            return super(Foo, self).__getattribute__(attr)
        except AttributeError:
            # attribute was not found, if it's not in your mapping, re-raise the error
            if attr not in self.mapping:
                raise
            mapped_attr = self.mapping[attr]
            return super(Foo, self).__getattribute__(mapped_attr)

    def someMethod(self):
        print "Foo().someMethod()"

foo = Foo()
foo.store()

输出:

^{pr2}$

如果我说得对,您可以简单地使用内置函数^{}。示例:

>>> class Foo(object):
...     def m1(self):
...         pass
...     def m2(self):
...         pass
... 
>>> dir(Foo)
['__class__', '__delattr__', '__dict__', '__doc__', '__format__', '__getattribute__', '__hash__', '__init__', '__module__', '__new__', '__reduce__', '__reduce_ex__', '__repr__', '__setattr__', '__sizeof__', '__str__', '__subclasshook__', '__weakref__', 'm1', 'm2']
>>> [m for m in dir(Foo) if '__' not in m]
['m1', 'm2']

编辑:你的问题和评论都不太清楚。如果你能编辑你的问题,提到你的预期结果,那会有帮助。我最好的猜测是,阅读下面您的评论(“我需要这本字典{int type: method type})你可能会想要:

^{pr2}$

编辑2:查看最新的pastebins,当您编写:

packet_ids_to_check_up = (0x0404, 0x0405, 0x0404, 0x0505, 0x0506)
    for packet_id in packet_ids_to_check_up:
        if packet_id in some_class_obj:
            some_class_obj[packet_id]('Hello world')

看来你想让你的班当字典。如果是这种情况,您可能应该看看^{}模块,尤其是MutableMapping类。从python glossary

^{bq}$

这意味着实施以下方法:

  • __contains__
  • keys
  • items
  • values
  • get
  • __eq__
  • __ne__
  • pop
  • popitem
  • clear
  • update
  • setdefault

然而,从你的代码来看,为什么你不能直接使用一个简单的字典(或者最终直接将dict子类化…)逃脱惩罚。在

这有帮助吗?在

相关问题 更多 >

    热门问题