德州网站优化公司,wordpress 发通知,潮州住房与建设局网站,海南网页制作通过前面章节的学习#xff0c;我们已经学会如何定义一个类#xff0c;但要想使用它#xff0c;必须创建该类的对象。
创建类对象的过程#xff0c;又称为类的实例化。
类名(参数)
定义类时#xff0c;如果没有手动添加 __init__() 构造方法#xff0c;又或者添加的 __in…通过前面章节的学习我们已经学会如何定义一个类但要想使用它必须创建该类的对象。
创建类对象的过程又称为类的实例化。
类名(参数)
定义类时如果没有手动添加 __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)
在上面的程序中由于构造方法除 self 参数外还包含 2 个参数且这 2 个参数没有设置默认参数因此在实例化类对象时需要传入相应的 name 值和 add 值self 参数是特殊参数不需要手动传值Python 会自动传给它值。
类变量和实例变量简单地理解定义在各个类方法之外包含在类中的变量为类变量或者类属性定义在类方法中的变量为实例变量或者实例属性二者的具体区别和用法可阅读《Python类变量和实例变量》
Python类对象的使用
定义的类只有进行实例化也就是使用该类创建对象之后才能得到利用。总的来说实例化后的类对象可以执行以下操作
访问或修改类对象具有的实例变量甚至可以添加新的实例变量或者删除已有的实例变量
调用类对象的方法包括调用现有的方法以及给类对象动态添加方法。
类对象访问变量或方法
使用已创建好的类对象访问类中实例变量的语法格式如下
类对象名.变量名
使用类对象调用类中方法的语法格式如下
对象名.方法名(参数)
注意对象名和变量名以及方法名之间用点 . 连接。
例如下面代码演示了如何通过 clanguage 对象调用类中的实例变量和方法
#输出name和add实例变量的值
print(clanguage.name,clanguage.add)
#修改实例变量的值
clanguage.namePython教程
clanguage.addhttp://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)
运行程序会发现结果显示 AttributeError 错误
Traceback (most recent call last):
File C:/Users/mengma/Desktop/1.py, line 29, in
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) # ②
上面的第 5 行和第 11 行代码分别使用函数、lambda 表达式为 clanguage 对象动态增加了方法但对于动态增加的方法Python 不会自动将方法调用者绑定到它们的第一个参数因此程序必须手动为第一个参数传入参数值如上面程序中 ① 号、② 号代码所示。
有读者可能会问有没有不用手动给 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)
可以看到由于使用 MethodType 包装 info() 函数时已经将该函数的 self 参数绑定为 clanguage因此后续再使用 info() 函数时就不用再给 self 参数绑定值了。