Tôi không tán thành điều này như là đặc biệt thành ngữ, nhưng ...
Giả sử tất cả các định nghĩa chức năng của bạn cư xử hệt như "chỉ cần gọi các hành vi cơ sở của lớp self.num
và áp dụng tất cả các đối số không tự đối với nó ", sau đó bạn có thể lặp qua tất cả các tên hàm bạn muốn xác định và tạo từng tên bằng cách sử dụng setattr
.Ví dụ:
class MyFancyNumber(object):
def __init__(self, num, info):
self.num = num
self.info = info
def __repr__(self):
return "MyFancyNumber({}, {})".format(repr(self.num), repr(self.info))
def make_func(name):
return lambda self, *args: MyFancyNumber(getattr(self.num, name)(*args), self.info)
for name in ["__add__", "__sub__", "__mul__", "__div__", "__invert__", "__neg__", "__pos__"]:
setattr(MyFancyNumber, name, make_func(name))
x = MyFancyNumber(50, "hello")
print(x + 10)
print(x - 10)
print(x * 10)
print(x/10)
print(~x)
print(-x)
print(+x)
Kết quả:
MyFancyNumber(60, 'hello')
MyFancyNumber(40, 'hello')
MyFancyNumber(500, 'hello')
MyFancyNumber(5, 'hello')
MyFancyNumber(-51, 'hello')
MyFancyNumber(-50, 'hello')
MyFancyNumber(50, 'hello')
Chỉnh sửa: Tôi đã không chắc chắn cho dù bạn muốn kết quả của số học là một MyFancyNumber hoặc thường xuyên built-in loại số, nhưng một trong hai cách này, việc triển khai khá giống:
class MyFancyNumber(object):
def __init__(self, num, info):
self.num = num
self.info = info
def __repr__(self):
return "MyFancyNumber({}, {})".format(repr(self.num), repr(self.info))
def make_func(name):
return lambda self, *args: getattr(self.num, name)(*args)
for name in ["__add__", "__sub__", "__mul__", "__div__", "__invert__", "__neg__", "__pos__"]:
setattr(MyFancyNumber, name, make_func(name))
x = MyFancyNumber(50, "hello")
print(x + 10)
print(x - 10)
print(x * 10)
print(x/10)
print(~x)
print(-x)
print(+x)
Kết quả:
60
40
500
5
-51
-50
50
https://docs.python.org/3/library/numbers.html Điều này có thể giúp bạn bắt đầu. –
Sử dụng '__add__' theo cách này có thể không làm những gì bạn muốn. 'MyFancyNumber (1, 'abc') + 1' sẽ cho bạn một đối tượng' int', không phải là 'MyFancyNumber'. –
Theo như tôi hiểu, anh ta không muốn trả lại MyFancyNumber, anh ta chỉ muốn có tất cả các chức năng như một số trong thuật ngữ của các toán tử. – Szabolcs