1

目标:扩展具有仅在特定上下文中有效的角色的任意类。

这有效:

# from https://github.com/niccokunzmann/wwp/blob/master/C_builtinTypes.py
from relative import roleOf, useRoles

@roleOf(int)
class NaturalNumber:
    # int gets successor only in this module
    @property
    def successor(self):
        return 1 + self

@roleOf(tuple)
@roleOf(list)
class MyList:
    @property
    def first(self):
        return self[0]

@useRoles
def test():
    # this is possible if we recompile the code objects
    i = 1
    print(type(i))
    assert i.successor == 2
    assert i.successor.successor == 3
    assert isinstance(i, int) # EDIT3 works
    # check for identity
    t = (3,)
    assert t.first == 3
    l = list() 
    l.append(3)
    assert l.first == 3 # this assertion fails
    assert l.first == 2 + 1

if __name__ == '__main__':
    test()

我的问题:

EDIT2:我为通常的 python 类编写了 100 行代码来完成这项工作,但对于内置函数,我添加了 250 行代码,并且看不到完整的解决方案。

我无法为内置对象创建自定义类,因为我可以使用纯 python 类作为link:Alink:B。这是因为编译器将它们放在任何地方:

>>> test.__code__.co_consts
(None, 1, 2, 3, (3,), 3)

我不能用列表替换代码对象,因为它们是内置在代码中的。

这些是我的问题,因为我无法估计:

  • 我必须在哪些地方寻找内置对象以用包装器替换它们以便我可以向它们添加角色?

  • C 扩展是否可以帮助我修补属性查找,以便我可以为布尔值创建角色

  • 我需要编译自己的 python 来实现这个想法吗?

  • 还有其他解决方案吗?

编辑 1

这是我的用例之一:1 .successor.successor == 3. 我想让拥有不干扰整个程序的小域变得容易=保持类苗条。

例如,我想让数字可调用以创建 lambda 演算。

我想拥有苗条的类,对于特殊用例,我想通过角色扩展它们,这样我就可以在它们上调用自定义函数。我应该在数据上下文交互和面向上下文的编程之间结束一些东西。

4

2 回答 2

0

您能否提供有关您的用例的更多信息?我认为您想研究元类,但如果没有有关您的特定需求的更多信息,则不确定。而且我认为如果您想替换内置函数,那就有问题或太聪明了。

于 2013-02-19T01:36:44.157 回答
0

我想你想看看抽象基类:

http://docs.python.org/3/library/abc.html

于 2013-02-19T12:26:18.600 回答