如何在Python中创建具有高度约束实例的类

2024-05-17 06:32:02 发布

您现在位置:Python中文网/ 问答频道 /正文

在Python中,有一些具有高度约束实例的内置类的示例。例如,“None”是其类的唯一实例,而在bool类中只有两个对象,“True”和“False”(我希望到目前为止我是正确的)。在

另一个很好的例子是整数:如果a和b是int类型的实例,那么a==b意味着a是b

两个问题:

  1. 如何创建具有类似约束实例的类?例如,我们可以要求一个只有5个实例的类。或者可以有无限多的实例,比如int类型,但这些不是任意的。

  2. 如果整数构成一个类,为什么int()给0实例?将其与用户定义的类Cl进行比较,其中Cl()将给出该类的一个实例,而不是一个特定的惟一实例,如0。int()是否应该返回一个未指定的整数对象,即没有指定值的整数?


Tags: 对象实例用户nonefalsetrue示例类型
3条回答

你说的是赋予一个类值语义,这通常是通过以正常方式创建类实例来完成的,但是记住每个实例,如果要创建一个匹配的实例,那么就给出已经创建的实例。在python中,这可以通过重载类__new__method来实现。在

简单的例子,假设我们想使用整数对来表示坐标,并且有适当的值语义。在

class point(object):
    memo = {}
    def __new__(cls, x, y):
        if (x, y) in cls.memo:         # if it already exists, 
            return cls.memo[(x, y)]    # return the existing instance
        else:                          # otherwise, 
            newPoint = object.__new__(cls) # create it, 
            newPoint.x = x             # initialize it, as you would in __init__
            newPoint.y = y             
            cls.memo[(x, y)] = newPoint # memoize it, 
            return newPoint            # and return it!

对于第一个问题,您可以实现单例类设计模式http://en.wikipedia.org/wiki/Singleton_pattern,您应该从中限制实例的数量。在

对于第二个问题,我想这可以解释你的问题http://docs.python.org/library/stdtypes.html

因为整数是类型,所以它有局限性。在

这是另一个资源。。。 http://docs.python.org/library/functions.html#built-in-funcs

似乎#1已经得到了很好的回答,我只想解释一个与#2相关的原则,这似乎是所有受访者都忽略的:对于大多数内置类型,调用不带参数的类型(“默认构造函数”)将返回该类型的实例,其计算结果为false。这意味着容器类型的容器是空的,对于数字类型,这个数字等于零。在

>>> import decimal
>>> decimal.Decimal()
Decimal("0")
>>> set()
set([])
>>> float()
0.0
>>> tuple()
()
>>> dict()
{}
>>> list()
[]
>>> str()
''
>>> bool()
False

看到了吗?真的很正常!此外,对于可变类型(如大多数容器),调用该类型总是返回一个新实例;对于不可变类型(如数字和字符串),这并不重要(返回对现有不可变实例的新引用是可能的内部优化,但执行此类优化不需要实现,如果这样做的话因为将不可变类型实例与is或通过id()等价地进行比较永远是不正确的。在

如果您设计了一个类型,其中某些实例可以计算为false(通过在类中使用__len____nonzero__特殊方法),那么建议遵循相同的规则(对于不可变的,__init__[或{}),如果没有参数调用[[beyondselffor __init__,而'cls'代表__new__,当然]],准备一个[[new,if mutable]]“empty”或“zero like”类实例)。在

相关问题 更多 >