在Python 3,object
是的实例type
和type
也是一个实例object
!
每个类如何可能从另一个派生?
有实施细节吗?
我使用进行了检查isinstance(sub, base)
,根据Python文档,它检查子类是否派生自基类:
isinstance(object, type)
Out[1]: True
isinstance(type, object)
Out[2]: True
这是Python中的一种极端情况:
object
内容的基本类型都是type
(在Python中是某种东西)是的实例object
。object
是所有内容的基本 类型 ,所以object
它也是 类型 ,它是object
的实例type
。请注意,您无法在Python中用自己的 东西 复制这种关系。这是语言中内置的一个例外。
在实现方面,这两个名称分别由PyBaseObject_Type
(for object
)和PyType_Type
(for type
)表示。
当您使用时isinstance
,类型检查(在其他所有步骤均失败之后的最后一步)是通过type_is_subtype_base_chain
以下方式完成的:
type_is_subtype_base_chain(PyTypeObject *a, PyTypeObject *b)
{
do {
if (a == b)
return 1;
a = a->tp_base;
} while (a != NULL);
return (b == &PyBaseObject_Type);
}
从本质上讲,这会继续提高的类型层次结构,a
并对照来检查结果类型b
。如果找不到,则最后的方法是检查在这种情况下函数是否b
真的object
返回true:因为所有内容都是对象。因此,“一切都是实例object
”部分实际上已硬编码到实例检查中。
至于为什么object
是a
type
,这实际上甚至更简单,因为它是在声明中以PyBaseObject_Type
这种方式定义的:
PyTypeObject PyBaseObject_Type = {
PyVarObject_HEAD_INIT(&PyType_Type, 0)
"object", /* tp_name */
sizeof(PyObject), /* tp_basicsize */
…
在PyVarObject_HEAD_INIT
本质上设置核心类型信息的东西,包括基本类型,这是PyType_Type
。
这种关系实际上还有两个后果:
object
它也是的一个实例object
:isinstance(object, object)
PyType_Type
也与实施相同PyVarObject_HEAD_INIT
,type
也是一种:isinstance(type, type)
。问题内容: 我对Python 3中的和类有些困惑。也许有人可以消除我的困惑或提供一些其他信息。 我目前的理解是,每个类(除外)都从称为的基类继承。但是每个类(包括)也是该类的一个实例,它是自身的实例,并且也从继承。 我的问题是: 是否有一个原因/设计决策,为什么是的实例并从中继承?对象的/ class是否也可以是对象本身? 类()如何成为其自身的实例? 哪一个是真正的基类或? 我一直认为这将是最“
我不知道如果没有其他变量告诉我哪个更大,我怎么能比较两个可比较的对象。问题是:创建一个名为Max的类,该类提供一个名为Max的类方法。Max将两个参数用于可以比较的对象,即实现如上所示的Java Compariable接口的对象。它返回对较大值的引用。如果两个对象相等,则应返回第一个对象。实现的可比性取决于每个类,您的方法将在多个不同类型的对象上调用。 它在接口中提供了int compareTo(
问题内容: 有没有更好的方法来简化由(1)…(2)括起来的语句? Java Reflection有帮助吗? 问题答案: 高效,干净地处理此问题的最佳方法是让foo返回对象的holder类。
我只是想知道类(Oracle提供的rt.jar内部)如java.lang.Object、java.lang.String是如何从.java源文件生成的。我认为,他们的javac不可能编译它们。 我尝试编译包含“类Dummy{}”的Dummy.java [解析已启动RegularFileObject[dummy.java]] [解析完成12毫秒] [源文件的搜索路径:.]
英文原文:http://emberjs.com/guides/object-model/classes-and-instances/ 定义一个新的Ember的类,只需要调用Ember.Object的extend()方法即可: 1 2 3 4 5 App.Person = Ember.Object.extend({ say: function(thing) { alert(thing)