Python类的实例化
对已定义好的类进行实例化,其语法格式如下:
类名(参数)
定义类时,如果没有手动添加 __init__() 构造方法,又或者添加的 __init__() 中仅有一个self 参数,则创建类对象时的参数可以省略不写。
例如,如下代码创建了名为 CLanguage 的类,并对其进行了实例化:
class PLanguage :
# 下面定义了2个类变量
name = "python学院"
add \= "https://www.cnblogs.com/qingchengzi"
def \_\_init\_\_(self,name,add):
#下面定义 2 个实例变量
self.name = name
self.add \= add
print(name,"网址为:",add)
# 下面定义了一个say实例方法
def say(self, content):
print(content)
# 将该PLanguage对象赋给obj\_py变量
obj\_py = PLanguage("python","http://www.cnblogs.com/qingchengzi")
在上面的程序中,由于构造方法除 self 参数外,还包含 2 个参数,且这 2 个参数没有设置默认参数,因此在实例化类对象时,需要传入相应的 name 值和 add 值(self 参数是特殊参数,不需要手动传值,Python 会自动传给它值)
类变量和实例变量,简单地理解,定义在各个类方法之外(包含在类中)的变量为类变量(或者类属性),定义在类方法中的变量为实例变量(或者实例属性)
Python类对象的使用
定义的类只有进行实例化,也就是使用该类创建对象之后,才能得到利用。总的来说,实例化后的类对象可以执行以下操作:
1、访问或修改类对象具有的实例变量,甚至可以添加新的实例变量或者删除已有的实例变量;
2、调用类对象的方法,包括调用现有的方法,以及给类对象动态添加方法。
类对象访问变量或方法
使用已创建好的类对象访问类中实例变量的语法格式如下:
类对象名.变量名
使用类对象调用类中方法的语法格式如下:
对象名.方法名(参数)
注意,对象名和变量名以及方法名之间用点 “.” 连接。
例如,下面代码演示了如何通过 obj_py对象调用类中的实例变量和方法:
# 输出name和add实例变量的值
print(obj\_py.name,obj\_py.add)
# 修改实例变量的值
obj\_py.name = "Python教程"
obj\_py.add \= "https://www.cnblogs.com/qingchengzi/p/18055134"
# 调用obj\_py的say()方法
obj\_py.say("人生苦短,我用Python")
# 再次输出name和add的值
print(obj\_py.name,obj\_py.add)
程序运行结果为:
python学院 http://www.cnblogs.com/qingchengzi
人生苦短,我用Python
Python教程 https://www.cnblogs.com/qingchengzi/p/18055134
给类对象动态添加/删除变量
Python 支持为已创建好的对象动态增加实例变量,方法也很简单,举个例子:
# 给obj\_py对象添加一个money实例变量
obj\_py.money = 20.56
print(obj\_py.money)
运行结果:
20.56
可以看到,通过直接增加一个新的实例变量并为其赋值,就成功地为 clanguage 对象添加了 money 变量。
既然能动态添加,那么是否能动态删除呢?答案是肯定的,使用 del 语句即可实现,例如:
# 删除新添加money实例变量
del obj\_py.money
# 再次输出money,会报错
print(obj\_py.money)
运行程序会发现,结果显示AttributeError错误:
AttributeError: 'PLanguage' object has no attribute 'money'
给类对象动态添加方法
Python 也允许为对象动态增加方法。以本节开头的 PLanguage 类为例,由于其内部只包含一个 say() 方法,因此该类实例化出的obj_py对象也只包含一个 say() 方法。但其实,我们还可以为 obj_py对象动态添加其它方法。
需要注意的一点是,为 clanguage 对象动态增加的方法,Python 不会自动将调用者自动绑定到第一个参数(即使将第一个参数命名为 self 也没用)。例如如下代码:
先定义一个函数
def info(self):
print("\_\_info函数\_\_",self)
# 使用info对obj\_py的foo方法赋值(动态绑定方法)
obj\_py.foo = info
# Python不会自动将调用者绑定到第一个参数,
# 因此程序需要手动将调用者绑定为第一个参数
obj\_py.foo(obj\_py) # ①
# 使用lambda表达式为obj\_py对象的bar方法赋值(动态绑定方法)
obj\_py.bar = lambda self: print('\--lambda表达式--', self)
obj\_py.bar(obj\_py) # ②
上面代码分别使用函数、lambda 表达式为 obj_py 对象动态增加了方法,但对于动态增加的方法,Python 不会自动将方法调用者绑定到它们的第一个参数,因此程序必须手动为第一个参数传入参数值,如上面程序中 ① 号、② 号代码所示。