目标: 使用仅在特定上下文中有效的角色扩展abitrary类。
这有效:
# 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:A或link:B。 这是因为编译器将它们放在任何地方:
>>> test.__code__.co_consts
(None, 1, 2, 3, (3,), 3)
我无法在带有列表的代码对象中进行替换,因为它们是在代码中构建的。
这些是我的问题,因为我无法估计它:
我有什么地方可以查找内置对象来用包装器替换它们,以便我可以为它们添加角色?
C扩展程序会帮我修补属性查找,这样我就可以为布尔值制作角色
我需要编译自己的python才能使这个想法有效吗?
还有另一种解决方案吗?
编辑1
这是我的一个使用案例:1 .successor.successor == 3
。
我希望能够轻松拥有不会干扰整个程序的小域名=保持班级苗条。
例如,我想让数字可调用以创建lambda演算。
我想要瘦的类和特殊用例我想通过角色扩展它们,所以我可以调用它们的自定义函数。 我最后会在Data-Context-Interaction和面向上下文的编程之间出现一些东西。
答案 0 :(得分:0)
您能否提供有关您的用例的更多信息?我想你想研究元类但不确定没有更多关于你的特定需求的信息。如果你想替换内置组件,我认为有些错误或太聪明。
答案 1 :(得分:0)
我想你想看看抽象基类: