我想要一个类,其实例在直接调用时返回一个值,就像它们从int,float,str等继承一样。我想它正在重载一些函数 ??? :
class A(object):
def __init__(self, value):
self.value = value
def somefunction(self):
if isintance(self.value, int):
return 5
else:
return 'something else'
def __???__(self):
return self.value
a = A(2)
a + 5 # 7
a.somefunction() # 5
a = A('foo')
a + "bar" # 'foobar'
a.somefunction() # 'something else'
我不能简单地将int子类化,因为值可能是不同类型的。
这可行吗?也许这是一个很好的理由,这是不可能的,但它已经很晚了,我想不到它。提前谢谢。
答案 0 :(得分:1)
由于元类混淆,覆盖__getattr__
将无效;问题是相关方法需要在实例的类dict中。
如果您对value
不可变感到满意,可以采用一种方式覆盖__new__
并按需构建类:
def __new__(cls, value):
return type("A", (type(value), A), {})(value)
请注意,这会在A
之后将type(value)
放入mro中;这是必要的,以阻止__new__
导致失控的递归!如果A
上的方法应该覆盖type(value)
上的方法,则可以将它们放入type()
的第3个dict参数中。
答案 1 :(得分:0)
您可以使用a.value + 'bar'
,也可以定义__add__
方法
class A(object):
def __init__(self, value):
self.value = value
def __add__(self, arg):
return self.value + arg
a = A(2)
print a + 5 # 7
a = A('foo')
print a.value + "bar" # 'foobar'
print a + "bar" # 'foobar'
Python函数和方法是一种通用的(你可以想到与C ++模板的相似性)。例如,+
运算符适用于数字类型和字符串。你不能混合类型;但是,当要执行操作时,操作数的类型检查是动态完成的。这样,__add__
方法适用于整数和字符串(以及复数和浮点数......)。
如果要在打印时显示实例的值(即不执行+
操作),可以定义__str__
方法:
def __str__(self):
return str(self.value)