通过前面章节的学习,我们已经学会如何定义一个类,但要想使用它,必须创建该类的对象。
创建类对象的过程,又称为类的实例化。
Python类的实例化
对已定义好的类进行实例化,其语法格式如下:类名(参数)
定义类时,如果没有手动添加 __init__() 构造方法,又或者添加的 __init__() 中仅有一个 self 参数,则创建类对象时的参数可以省略不写。例如,如下代码创建了名为 CLanguage 的类,并对其进行了实例化:
- class CLanguage :
- # 下面定义了2个类变量
- name = "C语言中文网"
- add = "http://c.biancheng.net"
- def __init__(self,name,add):
- #下面定义 2 个实例变量
- self.name = name
- self.add = add
- print(name,"网址为:",add)
- # 下面定义了一个say实例方法
- def say(self, content):
- print(content)
- # 将该CLanguage对象赋给clanguage变量
- clanguage = CLanguage("C语言中文网","http://c.biancheng.net")
类变量和实例变量,简单地理解,定义在各个类方法之外(包含在类中)的变量为类变量(或者类属性),定义在类方法中的变量为实例变量(或者实例属性),二者的具体区别和用法可阅读《Python类变量和实例变量》
Python类对象的使用
定义的类只有进行实例化,也就是使用该类创建对象之后,才能得到利用。总的来说,实例化后的类对象可以执行以下操作:- 访问或修改类对象具有的实例变量,甚至可以添加新的实例变量或者删除已有的实例变量;
- 调用类对象的方法,包括调用现有的方法,以及给类对象动态添加方法。
类对象访问变量或方法
使用已创建好的类对象访问类中实例变量的语法格式如下:类对象名.变量名
使用类对象调用类中方法的语法格式如下:对象名.方法名(参数)
注意,对象名和变量名以及方法名之间用点 "." 连接。例如,下面代码演示了如何通过 clanguage 对象调用类中的实例变量和方法:
- #输出name和add实例变量的值
- print(clanguage.name,clanguage.add)
- #修改实例变量的值
- clanguage.name="Python教程"
- clanguage.add="http://c.biancheng.net/python"
- #调用clanguage的say()方法
- clanguage.say("人生苦短,我用Python")
- #再次输出name和add的值
- print(clanguage.name,clanguage.add)
C语言中文网 网址为: http://c.biancheng.net
C语言中文网 http://c.biancheng.net
人生苦短,我用Python
Python教程 http://c.biancheng.net/python
给类对象动态添加/删除变量
Python 支持为已创建好的对象动态增加实例变量,方法也很简单,举个例子:- # 为clanguage对象增加一个money实例变量
- clanguage.money= 159.9
- print(clanguage.money)
159.9
可以看到,通过直接增加一个新的实例变量并为其赋值,就成功地为 clanguage 对象添加了 money 变量。既然能动态添加,那么是否能动态删除呢?答案是肯定的,使用 del 语句即可实现,例如:
- #删除新添加的 money 实例变量
- del clanguage.money
- #再次尝试输出 money,此时会报错
- print(clanguage.money)
Traceback (most recent call last):
File "C:/Users/mengma/Desktop/1.py", line 29, in <module>
print(clanguage.money)
AttributeError: 'CLanguage' object has no attribute 'money'
给类对象动态添加方法
注意,初学者在理解下面内容之前,需明白 self 参数的含义和作用,可阅读《Python self用法》详细了解。
Python 也允许为对象动态增加方法。以本节开头的 Clanguage 类为例,由于其内部只包含一个 say() 方法,因此该类实例化出的 clanguage 对象也只包含一个 say() 方法。但其实,我们还可以为 clanguage 对象动态添加其它方法。需要注意的一点是,为 clanguage 对象动态增加的方法,Python 不会自动将调用者自动绑定到第一个参数(即使将第一个参数命名为 self 也没用)。例如如下代码:
- # 先定义一个函数
- def info(self):
- print("---info函数---", self)
- # 使用info对clanguage的foo方法赋值(动态绑定方法)
- clanguage.foo = info
- # Python不会自动将调用者绑定到第一个参数,
- # 因此程序需要手动将调用者绑定为第一个参数
- clanguage.foo(clanguage) # ①
- # 使用lambda表达式为clanguage对象的bar方法赋值(动态绑定方法)
- clanguage.bar = lambda self: print('--lambda表达式--', self)
- clanguage.bar(clanguage) # ②
有读者可能会问,有没有不用手动给 self 传值的方法呢?通过借助 types 模块下的 MethodType 可以实现,仍以上面的 info() 函数为例:
- def info(self,content):
- print("C语言中文网地址为:%s" % content)
- # 导入MethodType
- from types import MethodType
- clanguage.info = MethodType(info, clanguage)
- # 第一个参数已经绑定了,无需传入
- clanguage.info("http://c.biancheng.net")