Python 对象和类

Python 是一种面向对象的编程语言。与面向过程的编程主要强调函数不同,面向对象的编程强调对象。
对象只是数据(变量)和作用于这些数据的方法(函数)的集合。同样,类是该对象的蓝图。
我们可以将类视为房屋的草图(原型)。它包含有关地板、门、窗等的所有细节。我们根据这些描述建造房屋。房子是对象。
由于可以根据房屋的蓝图制作许多房屋,因此我们可以从一个类中创建许多对象。对象也称为类的实例,创建此对象的过程称为实例化


在 Python 中定义一个类

就像Python 中的函数定义以def关键字开头一样,类定义也以class关键字开头。
类中的第一个字符串称为 docstring,其中包含对该类的简要说明。虽然不是强制性的,但强烈建议这样做。
这是一个简单的类定义。
class MyNewClass: ‘’’This is a docstring. I have created a new class’’’ pass
一个类创建一个新的本地命名空间,其中定义了它的所有属性。属性可以是数据或函数。
其中还有一些以双下划线开头的特殊属性。例如,doc__给我们该类的文档字符串。
一旦我们定义了一个类,就会创建一个同名的新类对象。这个类对象允许我们访问不同的属性以及实例化该类的新对象。

class Person: “This is a person class” age = 10 def greet(self): print(‘Hello’) # Output: 10 print(Person.age) # Output: print(Person.greet) # Output: “This is a person class” print(Person.doc)
输出
10 这是一个人类


在 Python 中创建对象

我们看到类对象可用于访问不同的属性。
它还可用于创建该类的新对象实例(实例化)。创建对象的过程类似于函数调用。
>>> harry = Person()
这将创建一个名为的新对象实例 哈利. 我们可以使用对象名称前缀访问对象的属性。
属性可以是数据或方法。对象的方法是该类的对应函数。
这意味着,既然Person.greet是一个函数对象(类的属性),Person.greet就会是一个方法对象。

class Person: “This is a person class” age = 10 def greet(self): print(‘Hello’) # create a new object of Person class harry = Person() # Output: print(Person.greet) # Output: > print(harry.greet) # Calling object’s greet() method # Output: Hello harry.greet()
输出
<0x7fd288e9fa30处<__main__.Person对象的绑定方法Person.greet>> 你好

您可能已经注意到self类内部函数定义中的参数,但我们只是简单地调用了该方法,就像harry.greet()没有任何参数一样。它仍然有效。
这是因为,每当对象调用其方法时,对象本身都会作为第一个参数传递。所以,harry.greet()转化为Person.greet(harry).
通常,调用带有 n 个参数列表的方法等效于调用带有参数列表的相应函数,该参数列表是通过在第一个参数之前插入方法的对象而创建的。
由于这些原因,类中函数的第一个参数必须是对象本身。这通常被称为自己. 它可以以其他方式命名,但我们强烈建议遵循约定。
现在您必须熟悉类对象、实例对象、函数对象、方法对象及其区别。


Python 中的构造函数

以双下划线开头的类函数被称为特殊函数,因为它们具有特殊的含义。
一个特别令人感兴趣的是
init__()函数。每当实例化该类的新对象时,就会调用此特殊函数。
这种类型的函数在面向对象编程 (OOP) 中也称为构造函数。我们通常使用它来初始化所有变量。

class ComplexNumber: def init(self, r=0, i=0): self.real = r self.imag = i def getdata(self): print(f’{self.real}+{self.imag}j’) # Create a new ComplexNumber object num1 = ComplexNumber(2, 3) # Call getdata() method # Output: 2+3j num1.get_data() # Create another ComplexNumber object # and create a new attribute ‘attr’ num2 = ComplexNumber(5) num2.attr = 10 # Output: (5, 0, 10) print((num2.real, num2.imag, num2.attr)) # but c1 object doesn’t have attribute ‘attr’ # AttributeError: ‘ComplexNumber’ object has no attribute ‘attr’ print(num1.attr)
输出
2+3j (5, 0, 10) 回溯(最近一次调用最后一次): 文件“”,第 27 行,在 中 打印(num1.attr) AttributeError: ‘ComplexNumber’ 对象没有属性 ‘attr’
在上面的例子中,我们定义了一个新类来表示复数。它有两个功能,__init
()初始化变量(默认为零)和get_data()正确显示数字。
在上面的步骤中需要注意的一件有趣的事情是可以动态创建对象的属性。我们创建了一个新属性属性 对于对象 数量 2并阅读它。但这不会为对象创建该属性编号 1.


删除属性和对象

可以使用该del语句随时删除对象的任何属性。在 Python shell 上尝试以下操作以查看输出。
>>> num1 = ComplexNumber(2,3) >>> del num1.imag >>> num1.get_data() Traceback (most recent call last): … AttributeError: ‘ComplexNumber’ object has no attribute ‘imag’ >>> del ComplexNumber.get_data >>> num1.get_data() Traceback (most recent call last): … AttributeError: ‘ComplexNumber’ object has no attribute ‘get_data’
我们甚至可以使用 del 语句删除对象本身。
>>> c1 = ComplexNumber(1,3) >>> del c1 >>> c1 Traceback (most recent call last): … NameError: name ‘c1’ is not defined
实际上,它比这更复杂。当我们这样做时c1 = ComplexNumber(1,3),会在内存中创建一个新的实例对象,名称c1 与之结合。
在命令中del c1,此绑定被删除,名称c1从相应的命名空间中删除。然而,该对象继续存在于内存中,如果没有其他名称绑定到它,它稍后会自动销毁。
Python 中这种对未引用对象的自动销毁也称为垃圾收集。
image.png
在 Python 中删除对象会移除名称绑定