分享

四、Python类对象的创建和使用

 星光闪亮图书馆 2019-08-08
使用 class 语句只能创建一个类,而无法创建类的对象,因此要想使用已创建好的类,还需要手动创建类的对象,创建类对象的过程又称为类的实例化。

对已创建的类进行实例化,其语法格式如下:

类名(参数)

当创建类时,若没有显式创建 __init()__ 构造方法或者该构造方法中只有一个 self 参数,则创建类对象时的参数可以省略不写。

例如,如下代码创建了名为 Python 的类,并对其进行了实例化:
  1. class Person :

  2.     '''这是一个学习Python定义的一个Person类'''

  3.     # 下面定义了2个类变量

  4.     name = "zhangsan"

  5.     age = "20"

  6.     def __init__(self,name,age):

  7.         #下面定义 2 个实例变量

  8.         self.name = name

  9.         self.age = age

  10.         print("这个人的名字是:",name," 年龄为:",age)

  11.     # 下面定义了一个say实例方法

  12.     def say(self, content):

  13.         print(content)

  14. # 将该Person对象赋给p变量

  15. p = Person("张三",20)

在上面的程序中,由于构造方法除 self 参数外,还包含 2 个参数,且这 2 个参数没有设置默认参数,因此在实例化类对象时,需要传入相应的 name 值和 age 值(self 参数是特殊参数,不需要手动传值,Python会自动传给它值)。

类变量和实例变量,简单地理解,定义在各个类方法之外(包含在类中)的变量为类变量(或者类属性),定义在类方法中的变量为实例变量(或者实例属性),二者的具体区别和用法可阅读《Python类变量和实例变量

Python类对象的使用

创建对象之后,接下来即可使用该对象了。Python 的对象大致有以下作用:
  • 操作对象的实例变量,包括访问、修改实例变量的值、以及给对象添加或删除实例变量)。

  • 调用对象的方法,包括调用对象的方法,已经给对象动态添加方法。

类对象访问变量或方法

使用已创建好的类对象访问类中实例变量的语法格式如下:

对象名.变量名

使用类对象调用类中方法的语法格式如下:

对象名.方法名(参数)

注意,对象名和变量名以及方法名之间用点 "." 连接。

下面代码通过 Person 对象来调用 Person 的实例变量和方法:
  1. # 输出p的name、age实例变量

  2. print(p.name, p.age)

  3. # 访问p的name实例变量,直接为该实例变量赋值

  4. p.name = '李刚'

  5. # 调用p的say()方法,声明say()方法时定义了2个形参,但第一个形参(self)不需要传值,因此调用该方法只需为第二个形参指定一个值

  6. p.say('Python语言很简单,学习很容易!')

  7. # 再次输出p的name、age实例变量

  8. print(p.name, p.age)

程序运行结果为:

这个人的名字是: 张三  年龄为: 20
张三 20
Python语言很简单,学习很容易!
李刚 20

给类对象动态添加变量

Python 支持为已创建好的对象动态增加实例变量,方法也很简单,只要为它的新变量赋值即可,比如说:
  1. # 为p对象增加一个skills实例变量

  2. p.skills = ['programming', 'swimming']

  3. print(p.skills)

运行结果为:

['programming', 'swimming']

上面程序为 p 对象动态增加了一个 skills 实例变量,即只要对 p 对象的 skills 实例变量赋值就是新增一个实例变量。也可以动态删除实例变量,使用 del 语句即可删除,例如如下代码:
  1. # 删除p对象的name实例变量

  2. del p.name

  3. # 再次访问p的name实例变量

  4. print(p.name)

程序中调用 del 删除了 p 对象的 name 实例变量,但由于类中还有同名的 name 类变量,因此程序不会报错;否则会导致 AttributeError 错误,并提示:'Person' object has no attribute 'name'

给类对象动态添加方法

注意,初学者在理解下面内容之前,需明白 self 参数的含义和作用,可阅读《Python self用法》详细了解。

Python 也允许为对象动态增加方法。比如上面程序中在定义 Person 类时只定义了一个 say() 方法,但程序完全可以为 p 对象动态增加方法。

但需要说明的是,为 p 对象动态增加的方法,Python 不会自动将调用者自动绑定到第一个参数(即使将第一个参数命名为 self 也没用)。例如如下代码:
  1. # 先定义一个函数

  2. def info(self):

  3. print("---info函数---", self)

  4. # 使用info对p的foo方法赋值(动态绑定方法)

  5. p.foo = info

  6. # Python不会自动将调用者绑定到第一个参数,

  7. # 因此程序需要手动将调用者绑定为第一个参数

  8. p.foo(p) # ①

  9. # 使用lambda表达式为p对象的bar方法赋值(动态绑定方法)

  10. p.bar = lambda self: print('--lambda表达式--', self)

  11. p.bar(p) # ②

上面的第 5 行和第 11 行代码分别使用函数、lambda 表达式为 p 对象动态增加了方法,但对于动态增加的方法,Python 不会自动将方法调用者绑定到它们的第一个参数,因此程序必须手动为第一个参数传入参数值,如上面程序中 ① 号、② 号代码所示。

如果希望动态增加的方法也能自动绑定到第一个参数,则可借助于 types 模块下的 MethodType 进行包装。例如如下代码:
  1. def intro_func(self, content):

  2. print("我是一个人,信息为:%s" % content)

  3. # 导入MethodType

  4. from types import MethodType

  5. # 使用MethodType对intro_func进行包装,将该函数的第一个参数绑定为p

  6. p.intro = MethodType(intro_func, p)

  7. # 第一个参数已经绑定了,无需传入

  8. p.intro("生活在别处")

正如从上面代码所看到的,通过 MethodType 包装 intr_func 函数之后(包装时指定了将该函数的第一个参数绑定为 p),为 p 对象动态增加的 intro() 方法的第一个参数己经绑定,因此程序通过 p 调用 intro() 方法时无须传入第一个参数,就像定义类时己经定义了 intro() 方法一样。

    本站是提供个人知识管理的网络存储空间,所有内容均由用户发布,不代表本站观点。请注意甄别内容中的联系方式、诱导购买等信息,谨防诈骗。如发现有害或侵权内容,请点击一键举报。
    转藏 分享 献花(0

    0条评论

    发表

    请遵守用户 评论公约

    类似文章 更多