当我们创建一个类时,我们似乎有一个模板对象(我的意思是缩进类中编写的所有内容)和原始对象本身,可以通过类名访问它(类名是到此的链接)原始对象):
class InCap:
name = 10
InCap.name = 203 #мы можем убедиться в существовании оригинального объекта, сразу изменив его атрибут
print(InCap.name) # Вывод : 203
在课程和教育材料中(至少在我学习的课程和教育材料中)据说我们可以创建类的实例,但事实证明我们正在创建原始对象的实例,而不是类的实例,因为默认情况下,实例继承所有属性,包括父属性(类模板中描述的属性)和本地属性(我们可以添加到原始属性中的属性):
Namer = InCap() #создали экземпляр оригинального объекта
# Добавим в оригинальный объект новый атрибут:
InCap.Unname = 30
print(f'новый атрибут оригинального объекта: {Namer.Unname}, родительский атрибут оригинального объекта: {Namer.Name}')
# Вывод: новый атрибут оригинального объекта: 30, родительский атрибут оригинального объекта: 203
我们看到实例从原始对象继承了 Name 和 Unname 属性(而不是从没有 Unname 属性的类继承),并且只有在我们覆盖它们之前才会发生这种情况:
Namer.Unname = 'переопределили'
Namer.Name = 'переопределили'
print(Namer.Unname, Namer.Name)# Вывод: переопределили переопределили Теперь это локальные атрибуты.
print(InCap.Name, InCap.Unname)# Вывод: 203 30
原始对象的属性保持不变,上面的更改不会影响本地属性:
print(Namer.Unname, Namer.Name)
print(InCap.Name, InCap.Unname)
# Вывод:
# переопределили переопределили
# изменили изменили
总而言之,我从来没有听说过创建原始对象的实例并从中继承属性,到处都有类的实例,但实际上事实证明模板与它无关,这种表述会导致混乱,至少对我来说。总的来说,如果您证实或反驳我的猜测,我会很高兴,提前感谢您的回答。
也许你的困惑是由于Python设计的一些特殊性引起的;一般来说,对于大多数语言来说,我们不能将类视为对象。在OOP中,如果我们脱离Python语言的上下文来理解它,类只是未来对象的模板指令;根据这条指令,编译器或解释器创建对象——分配内存,放置方法的代码及其地址, ETC。可以说,这是经典的类视图。这就是“类实例”概念的由来,与“类对象”相同——根据给定类的模板创建的对象。 Python 的一个特性是,一旦我们声明类,它们本身就是对象(顺便说一下,它们是另一个类的对象——它们的元类)。但在文献中,如果你读到“类对象”,它应该被理解为经典意义上的(也许除非这是一章致力于将类理解为Python中的独立对象)。您可以通过class字段查看对象属于哪个类:
该代码将输出:
因为 Foo 是类类型的对象——它是所有对象的公共默认元类,而 f 是 Foo 的对象。
值得记住的是,这样的系统是 Python 语言的一个特性,在其他语言中它是不同的,并且在一般情况下,类不是任何类型的对象,而只是一个绘图指令。
与往常一样,Python 的许多特性都是通过以下事实来解释的:在 Python 中,任何实体都是对象,而且是“一流对象”。类也是一个对象,就像类的实例一样。您可以即时更改类对象的某些字段。顺便说一句,您可以使用函数以及其他类型的对象来完成此操作,这些对象在其他语言中通常无法直接访问并且无法在其中进行更改。这在其他语言之后是不寻常的。
但让我们回到我们的课堂。让我们再次概述一下Python的特点:
type嗯,那就是,是的。一切都如您所说,从 Python 的角度来看,这是完全合乎逻辑的。原则上,理论上,该语言的创建者可以维护两个单独的对象属性列表 - 那些在程序源代码中指定的列表,以及那些在程序执行期间添加的列表。但在 Python 中不存在这样的事情,其中所有实体都过着动态的生活,没有人跟踪对象在哪个阶段获得了某些属性。