类名(参数)
定义类时,如果没有手动添加 __init__() 构造方法,又或者添加的 __init__() 中仅有一个 self 参数,则创建类对象时的参数可以省略不写。class CLanguage : # 下面定义了2个类变量 name = "C语言中文网" add = "http://task.lmcjl.com" 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://task.lmcjl.com")在上面的程序中,由于构造方法除 self 参数外,还包含 2 个参数,且这 2 个参数没有设置默认参数,因此在实例化类对象时,需要传入相应的 name 值和 add 值(self 参数是特殊参数,不需要手动传值,Python 会自动传给它值)。
类变量和实例变量,简单地理解,定义在各个类方法之外(包含在类中)的变量为类变量(或者类属性),定义在类方法中的变量为实例变量(或者实例属性),二者的具体区别和用法可阅读《Python类变量和实例变量》
类对象名.变量名
使用类对象调用类中方法的语法格式如下:对象名.方法名(参数)
注意,对象名和变量名以及方法名之间用点 "." 连接。#输出name和add实例变量的值 print(clanguage.name,clanguage.add) #修改实例变量的值 clanguage.name="Python教程" clanguage.add="http://task.lmcjl.com/python" #调用clanguage的say()方法 clanguage.say("人生苦短,我用Python") #再次输出name和add的值 print(clanguage.name,clanguage.add)程序运行结果为:
C语言中文网 网址为: http://task.lmcjl.com
C语言中文网 http://task.lmcjl.com
人生苦短,我用Python
Python教程 http://task.lmcjl.com/python
# 为clanguage对象增加一个money实例变量 clanguage.money= 159.9 print(clanguage.money)运行结果为:
159.9
可以看到,通过直接增加一个新的实例变量并为其赋值,就成功地为 clanguage 对象添加了 money 变量。#删除新添加的 money 实例变量 del clanguage.money #再次尝试输出 money,此时会报错 print(clanguage.money)运行程序会发现,结果显示 AttributeError 错误:
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 对象动态添加其它方法。# 先定义一个函数 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 不会自动将方法调用者绑定到它们的第一个参数,因此程序必须手动为第一个参数传入参数值,如上面程序中 ① 号、② 号代码所示。
def info(self,content): print("C语言中文网地址为:%s" % content) # 导入MethodType from types import MethodType clanguage.info = MethodType(info, clanguage) # 第一个参数已经绑定了,无需传入 clanguage.info("http://task.lmcjl.com")可以看到,由于使用 MethodType 包装 info() 函数时,已经将该函数的 self 参数绑定为 clanguage,因此后续再使用 info() 函数时,就不用再给 self 参数绑定值了。
本文链接:http://task.lmcjl.com/news/9626.html