直接调用时返回值(不是实例)的实例

时间:2012-06-11 07:10:10

标签: python class inheritance object overloading

我想要一个类,其实例在直接调用时返回一个值,就像它们从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子类化,因为值可能是不同类型的。

这可行吗?也许这是一个很好的理由,这是不可能的,但它已经很晚了,我想不到它。提前谢谢。

2 个答案:

答案 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)