Ble*_*der 7 python int metaclass subclass
在看到这个问题之后,我开始想知道:是否有可能编写一个行为类似于随机整数的类?
我设法找到一些可覆盖的方法dir():
class RandomInt(int):
def __add__(self, other):
return randint(1, 100) + other
def __mul__(self, other):
return randint(1, 100) * other
def __div__(self, other):
return randint(1, 100) / other
def __sub__(self, other):
return randint(1, 100) - other
def __repr__(self):
return str(randint(1, 100))
Run Code Online (Sandbox Code Playgroud)
但我觉得有一种更优雅的方式来注入randint(1, 100)接受self参数的每个方法.
有没有办法做到这一点,而无需int从头开始重写整个班级?
就像是:
>>> x = RandomInt()
>>> x + 1
2
>>> x + 1
74
>>> x * 4
152
Run Code Online (Sandbox Code Playgroud)
一个想法是拥有一种__call__返回随机数的方法。
class RandomInt(int):
def __call__(self):
return random.randint(1, 100)
def __add__(self, other):
return self() + other
def __mul__(self, other):
return self() * other
def __div__(self, other):
return self() / other
def __sub__(self, other):
return self() - other
def __repr__(self):
return str(self())
Run Code Online (Sandbox Code Playgroud)
运行示例
>>> x = RandomInt()
>>> x * 3
81
>>> x + 3
56
>>> x - 4
68
>>> x / 4
2
Run Code Online (Sandbox Code Playgroud)