在Python中,有一些具有高度约束实例的内置类的示例。例如,“None”是其类的唯一实例,而在bool类中只有两个对象,“True”和“False”(我希望到目前为止我是正确的)。在
另一个很好的例子是整数:如果a和b是int类型的实例,那么a==b意味着a是b
两个问题:
如何创建具有类似约束实例的类?例如,我们可以要求一个只有5个实例的类。或者可以有无限多的实例,比如int类型,但这些不是任意的。
如果整数构成一个类,为什么int()给0实例?将其与用户定义的类Cl进行比较,其中Cl()将给出该类的一个实例,而不是一个特定的惟一实例,如0。int()是否应该返回一个未指定的整数对象,即没有指定值的整数?
你说的是赋予一个类值语义,这通常是通过以正常方式创建类实例来完成的,但是记住每个实例,如果要创建一个匹配的实例,那么就给出已经创建的实例。在python中,这可以通过重载类
__new__
method来实现。在简单的例子,假设我们想使用整数对来表示坐标,并且有适当的值语义。在
对于第一个问题,您可以实现单例类设计模式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。这意味着容器类型的容器是空的,对于数字类型,这个数字等于零。在
看到了吗?真的很正常!此外,对于可变类型(如大多数容器),调用该类型总是返回一个新实例;对于不可变类型(如数字和字符串),这并不重要(返回对现有不可变实例的新引用是可能的内部优化,但执行此类优化不需要实现,如果这样做的话因为将不可变类型实例与
is
或通过id()
等价地进行比较永远是不正确的。在如果您设计了一个类型,其中某些实例可以计算为false(通过在类中使用}),如果没有参数调用[[beyond
__len__
或__nonzero__
特殊方法),那么建议遵循相同的规则(对于不可变的,__init__
[或{self
for__init__
,而'cls'代表__new__
,当然]],准备一个[[new,if mutable]]“empty”或“zero like”类实例)。在相关问题 更多 >
编程相关推荐