个性化阅读
专注于IT技术分析

python3对象和类 – Python3教程

上一章Python教程请查看:python3面向对象编程

在本文中,你将了解Python、Python对象和类的核心功能,你将了解什么是类,如何创建它并在程序中使用它。

Python中的类和对象是什么?

Python是一种面向对象的编程语言,与主要强调函数的面向过程编程不同,面向对象编程强调对象。

对象只是作用于这些数据的数据(变量)和方法(函数)的集合,类是对象的蓝图。

我们可以把类看作是一所房子的草图(原型),它包含了所有关于地板、门、窗等的细节。根据这些描述,我们建造了这座房子,房子就是目标。

因为,许多房子可以从一个描述中生成,我们可以从一个类中创建许多对象。对象也称为类的实例,创建该对象的过程称为实例化。

用Python定义一个类

就像函数定义以关键字def开头一样,在Python中,我们使用关键字类来定义一个类。

第一个字符串称为docstring,它对类有一个简短的描述。虽然不是强制性的,但建议这样做。

下面是一个简单的类定义。

class MyNewClass:
    '''这是一个文档字符串。我创建了一个新类'''
    pass

类创建一个新的本地名称空间,其中定义了它的所有属性,属性可以是数据或函数。

还有一些特殊属性以双下划线(__)开头,例如,_doc__给我们该类的文档字符串。

一旦定义了一个类,就会创建一个具有相同名称的新类对象,这个类对象允许我们访问不同的属性以及实例化该类的新对象。

class MyClass:
    "第二个类"
    a = 10
    def func(self):
        print('Hello')

# 输出: 10
print(MyClass.a)

# 输出: <function MyClass.func at 0x0000000003079BF8>
print(MyClass.func)

# 输出: '第二个类'
print(MyClass.__doc__)

在Python中创建对象

我们看到类对象可以用来访问不同的属性。

它还可以用来创建该类的新对象实例(实例化),创建对象的过程类似于函数调用。

>>> ob = MyClass()

这将创建一个新的实例对象ob,我们可以使用对象名称前缀来访问对象的属性。

属性可以是数据或方法,对象的方法是该类的对应函数,类属性的任何函数对象都为该类的对象定义了一个方法。

这意味着,因为MyClass.func是一个函数对象(类的属性),ob.func是一个方法对象。

class MyClass:
    "第二个类"
    a = 10
    def func(self):
        print('Hello')

ob = MyClass()

# 输出: <function MyClass.func at 0x000000000335B0D0>
print(MyClass.func)

# 输出: <bound method MyClass.func of <__main__.MyClass object at 0x000000000332DEF0>>
print(ob.func)

# 调用 func()
# 输出: Hello
ob.func()

你可能已经注意到了类内部函数定义中的self参数,但是,我们只是简单地将该方法称为ob.func(),没有任何参数,但它仍然工作。

这是因为,每当一个对象调用它的方法时,对象本身都会作为第一个参数传递,因此,ob.func()转换成MyClass.func(ob)。

通常,用n个参数的列表调用方法等价于用一个参数列表调用相应的函数,这个参数列表是通过在第一个参数之前插入方法的对象创建的。

由于这些原因,类中函数的第一个参数必须是对象本身,这就是习惯上所说的self,它可以被命名为其他,但我们强烈建议遵循公约。

现在你必须熟悉类对象、实例对象、函数对象、方法对象及其区别。

在Python中构造函数

以双下划线(__)开头的类函数称为特殊函数,因为它们有特殊的含义。

一个特别有趣的功能是__init__()函数,每当实例化该类的新对象时,都会调用此特殊函数。

这种类型的函数在面向对象编程(OOP)中也称为构造函数,我们通常使用它来初始化所有变量。

class ComplexNumber:
    def __init__(self,r = 0,i = 0):
        self.real = r
        self.imag = i

    def getData(self):
        print("{0}+{1}j".format(self.real,self.imag))

# 创建一个新的ComplexNumber对象
c1 = ComplexNumber(2,3)

# 调用 getData() 函数
# 输出: 2+3j
c1.getData()

# 创建一个新的ComplexNumber对象
# 创建新的属性 'attr'
c2 = ComplexNumber(5)
c2.attr = 10

# 输出: (5, 0, 10)
print((c2.real, c2.imag, c2.attr))

# AttributeError: 'ComplexNumber' object has no attribute 'attr'
c1.attr

在上面的例子中,我们定义了一个新的类来表示复数,它有两个函数,用于初始化变量(默认为0)和getData()以正确显示数字。

在上述步骤中需要注意的一件有趣的事情是,可以动态地创建对象的属性。我们为对象c2创建了一个新的属性attr,并读取它,但这并没有为对象c1创建该属性。

删除属性和对象

可以使用del语句随时删除对象的任何属性,在Python shell上尝试以下操作以查看输出。

>>> c1 = ComplexNumber(2,3)
>>> del c1.imag
>>> c1.getData()
Traceback (most recent call last):
...
AttributeError: 'ComplexNumber' object has no attribute 'imag'
>>> del ComplexNumber.getData
>>> c1.getData()
Traceback (most recent call last):
...
AttributeError: 'ComplexNumber' object has no attribute 'getData'

我们甚至可以使用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中这种对未引用对象的自动销毁也称为垃圾收集或回收。

在Python中删除对象
赞(1)
未经允许不得转载:srcmini » python3对象和类 – Python3教程

评论 抢沙发

评论前必须登录!