1

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

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

4

2 回答 2

1

由于元类混淆,覆盖__getattr__将不起作用;问题是相关方法需要在实例的类字典中。

如果您对不可变感到满意value,一种方法可能是__new__按需覆盖和构造类:

def __new__(cls, value):
    return type("A", (type(value), A), {})(value)

请注意,这放在mroA之后type(value);这是停止__new__导致失控递归的必要条件!如果上面的方法A应该覆盖那些 on type(value),您可以将它们放入 dict 的第三个参数中type()

于 2012-06-11T07:38:28.770 回答
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)
于 2012-06-11T07:25:37.820 回答