透明地将值分配给自定义数字类型

时间:2017-03-30 10:14:56

标签: python python-3.x

我想创建自定义数字类型。基本上是一个float,它的值在赋值后由我的自定义类处理。 我有seen examples解释如何创建类并将其作为常见类型(int / float / ...)读取。 然而,没有关于如何使值赋值与浮点变量一样透明的例子。

到目前为止,我所看到的是:

a = MyCustomFloat( 20. )
print(a) # prints "20"

我在寻找的是:

a = MyCustomFloat()
a = 20. # assign new value ; "a" is still an instance of MyCustomFloat
print(a) # prints "20"

这有可能吗?

如果是,怎么样?

2 个答案:

答案 0 :(得分:3)

无法在变量级别覆盖此行为,但如果您愿意将fputs( $output, "\xEF\xBB\xBF" ); fputcsv($output, mb_convert_encoding($myrow, 'UCS-2LE', 'UTF-8')); 定义为类的属性,则可以实现using descriptors

a

<强>演示:

class MyCustomClass:
    def __init__(self, val):
        self.val = val

    def __get__(self, instance, kls=None):
        return self 

    def __repr__(self):
        return repr(self.val)

    def __set__(self, instance, val):
        if not isinstance(val, (int, float)):
            raise TypeError('Only objects of type int and float can be assigned')
        self.val = val  # This can be self.val = MyCustomClass(val) as well.


class NameSpace:
    a = MyCustomClass(20.)

在可变级别,您唯一的选择是使用mypy进行一些静态检查(正如Chris提到的那样)。这不会在运行时阻止此类分配,但可以在部署代码之前运行静态代码分析器时指出此类分配。

答案 1 :(得分:0)

由于Python是一种动态语言,你可以在以后分配你想要的任何东西,所以事先声明它的类型可能对你没有任何好处,因为你可以这样做:

a = MyType()
a = 'hi'
a = 2.3

这意味着,如果您执行类似

的操作
a = MyType()
a = 20.
type(a) 

它可能会返回默认值(float或float64)。如果您想要静态类型之类的内容(一旦您声明a类型为MyType,它就会保持这种状态)我推荐使用类似mypy

的内容

希望有所帮助