【发布时间】:2011-05-08 22:25:56
【问题描述】:
只是一个简单的问题:什么时候应该使用术语“类”,什么时候应该在 Python 中使用术语“类型”?
- “class”仅适用于用户定义的类型,“type”适用于内置类型?
- 或者现在everything is a type ...即使对于用户定义的类,我是否应该始终使用“类型”?
- ... ?
【问题讨论】:
标签: python class types terminology
只是一个简单的问题:什么时候应该使用术语“类”,什么时候应该在 Python 中使用术语“类型”?
【问题讨论】:
标签: python class types terminology
它或多或少具有历史意义:they used to be different 很久以前,不再具有实际意义。
编辑:我在提及具体实现时使用“class”,在谈到高级数据结构、应用程序架构等时,我以更非正式的方式使用“type”。在我的想法一个类型是一个更普遍的东西,我不认为每个类都是一个不同的类型。
此外,当我使用元类(很少)时,我会提到类型。
【讨论】:
class 是一个 Python 数据结构,可以通过调用它作为该类实例的模板,例如foo = Foo().
type 是一个类,可以通过继承的方式用作其他类的模板,例如class Foo(Bar):
由于 Python 支持继承,所有类都可以用作附加类的模板,这意味着所有类实际上都是类型。
自从派生自object 的“新型类”出现以来尤其如此,它将用户定义类的类型层次结构与内置类型统一起来。类一直是类型,但现在它们是与内置类型相同的类型。
虽然 Python 类是类型,但我仍然觉得这种区别很有用,所以这些术语在我看来并不完全是同义词。
奖励定义:元类是一个类,其实例是类。在 Python 中,这些必须派生自 type 类,就像新式对象派生自 object.
【讨论】:
我使用“类型”来指代一般情况,但当我谈到属性时,我会切换到“类”。
但你选择哪个并不重要。
{}的类型为dict。dict类的iteritems()方法返回一个迭代器。
【讨论】:
__new__ 是构造函数,__init__ 是初始化器。
这可能不会直接回答您的问题,但它可能会让您了解类型和类之间的区别。
class Card:
def __init__(self, suit=0, rank=0):
self.suit = suit
self.rank = rank
card1 = Card()
Card是一个类对象,所以它的类型是type。
但是,card1 是Card 的一个实例,所以它的类型是Card。
【讨论】:
你可以说一个对象在运行时属于某个单一类型,但通过(多)继承,它可以被视为属于多个类。
【讨论】:
is 类型。
在python代码中type是object,但class是keyword,因此,根据上下文,这些词可以有不同的含义。对此有更深入了解的人似乎对此感到满意。
type 对象用于提供与 class 关键字等效的功能。
class Base(object):
_about_base = 'An attribute of Base'
class MyClass(Base):
about_myclass = 'An attribute of myclass'
that = MyClass
this = type( 'MyClass', (Base,), dict( about_myclass='An attribute of myclass' ) )
上述代码生成的this和that是相同的,都是type类的实例。您也许可以说它们是type 类型的实例。 x = this() 是 this 类/类型的实例。
x = this()
assert type(this) is type
assert type(x) is this
【讨论】: