Python:术语“类”VS“类型”
Posted
技术标签:
【中文标题】Python:术语“类”VS“类型”【英文标题】:Python : terminology 'class' VS 'type' 【发布时间】:2011-05-08 22:25:56 【问题描述】:只是一个简单的问题:什么时候应该使用术语“类”,什么时候应该在 Python 中使用术语“类型”?
“class”仅适用于用户定义的类型,“type”适用于内置类型? 或者现在everything is a type ...即使对于用户定义的类,我是否应该始终使用“类型”? ... ?【问题讨论】:
【参考方案1】:它或多或少具有历史意义:they used to be different 很久以前,不再具有实际意义。
编辑:我在提及具体实现时使用“class
”,在谈到高级数据结构、应用程序架构等时,我以更非正式的方式使用“type
”。在我的想法一个类型是一个更普遍的东西,我不认为每个类都是一个不同的类型。
此外,当我使用元类(很少)时,我会提到类型。
【讨论】:
还有你自己,你什么时候使用其中一个?【参考方案2】:class 是一个 Python 数据结构,可以通过调用它作为该类实例的模板,例如foo = Foo()
.
type 是一个类,可以通过继承的方式用作其他类的模板,例如class Foo(Bar):
由于 Python 支持继承,所有类都可以用作附加类的模板,这意味着所有类实际上都是类型。
自从派生自object
的“新型类”出现以来尤其如此,它将用户定义类的类型层次结构与内置类型统一起来。类一直是类型,但现在它们是与内置类型相同的类型。
虽然 Python 类是类型,但我仍然觉得这种区别很有用,所以这些术语在我看来并不完全是同义词。
奖励定义:元类是一个类,其实例是类。在 Python 中,这些必须派生自 type
类,就像新式对象派生自 object.
【讨论】:
【参考方案3】:我使用“类型”来指代一般情况,但当我谈到属性时,我会切换到“类”。
但你选择哪个并不重要。
的类型为
dict
。dict
类的iteritems()
方法返回一个迭代器。
【讨论】:
好吧...我只是想知道这一点,因为奇怪的是 1 事物会有 2 个名称...尤其是对于像 Python 这样非常简洁的语言! 等到你点击“constructor”与“initializer”。 "constructor" vs. "initializer" 一点也不令人困惑。__new__
是构造函数,__init__
是初始化器。
@aaronsterling:不,不是这样。【参考方案4】:
这可能不会直接回答您的问题,但它可能会让您了解类型和类之间的区别。
class Card:
def __init__(self, suit=0, rank=0):
self.suit = suit
self.rank = rank
card1 = Card()
Card
是一个类对象,所以它的类型是type
。
但是,card1
是Card
的一个实例,所以它的类型是Card
。
【讨论】:
嗯……你也可以说“Card 是一个类型的实例”而不是“Card 是一个类对象”,我们回到正题!仍然不需要“类”这个词;)【参考方案5】:你可以说一个对象在运行时属于某个单一类型,但通过(多)继承,它可以被视为属于多个类。
【讨论】:
否,因为“通过多重继承”它也属于所有这些类型。你会选择它属于哪一种类型?类is
类型。
我喜欢运行时方面;创建新类型时,它是一个类,而在创建具体类时,它是一个类型。【参考方案6】:
在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
【讨论】:
以上是关于Python:术语“类”VS“类型”的主要内容,如果未能解决你的问题,请参考以下文章