首页 > 编程语言 >Python类对象的创建和使用

Python类对象的创建和使用

时间:2022-10-18 20:55:17浏览次数:73  
标签:变量 Python 创建 self 对象 实例 clanguage

通过前面章节的学习,我们已经学会如何定义一个类,但要想使用它,必须创建该类的对象。

创建类对象的过程,又称为类的实例化。

Python类的实例化

对已定义好的类进行实例化,其语法格式如下:

类名(参数)

定义类时,如果没有手动添加 __init__() 构造方法,又或者添加的 __init__() 中仅有一个 self 参数,则创建类对象时的参数可以省略不写。

例如,如下代码创建了名为 CLanguage 的类,并对其进行了实例化:
  1. class CLanguage :
  2. # 下面定义了2个类变量
  3. name = "C语言中文网"
  4. add = "http://c.biancheng.net"
  5. def __init__(self,name,add):
  6. #下面定义 2 个实例变量
  7. self.name = name
  8. self.add = add
  9. print(name,"网址为:",add)
  10. # 下面定义了一个say实例方法
  11. def say(self, content):
  12. print(content)
  13. # 将该CLanguage对象赋给clanguage变量
  14. clanguage = CLanguage("C语言中文网","http://c.biancheng.net")
在上面的程序中,由于构造方法除 self 参数外,还包含 2 个参数,且这 2 个参数没有设置默认参数,因此在实例化类对象时,需要传入相应的 name 值和 add 值(self 参数是特殊参数,不需要手动传值,Python 会自动传给它值)。

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

Python类对象的使用

定义的类只有进行实例化,也就是使用该类创建对象之后,才能得到利用。总的来说,实例化后的类对象可以执行以下操作:
  • 访问或修改类对象具有的实例变量,甚至可以添加新的实例变量或者删除已有的实例变量;
  • 调用类对象的方法,包括调用现有的方法,以及给类对象动态添加方法。

类对象访问变量或方法

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

类对象名.变量名

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

对象名.方法名(参数)

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

例如,下面代码演示了如何通过 clanguage 对象调用类中的实例变量和方法:
  1. #输出name和add实例变量的值
  2. print(clanguage.name,clanguage.add)
  3. #修改实例变量的值
  4. clanguage.name="Python教程"
  5. clanguage.add="http://c.biancheng.net/python"
  6. #调用clanguage的say()方法
  7. clanguage.say("人生苦短,我用Python")
  8. #再次输出name和add的值
  9. print(clanguage.name,clanguage.add)
程序运行结果为:

C语言中文网 网址为: http://c.biancheng.net
C语言中文网 http://c.biancheng.net
人生苦短,我用Python
Python教程 http://c.biancheng.net/python

给类对象动态添加/删除变量

Python 支持为已创建好的对象动态增加实例变量,方法也很简单,举个例子:
  1. # 为clanguage对象增加一个money实例变量
  2. clanguage.money= 159.9
  3. print(clanguage.money)
运行结果为:

159.9

可以看到,通过直接增加一个新的实例变量并为其赋值,就成功地为 clanguage 对象添加了 money 变量。

既然能动态添加,那么是否能动态删除呢?答案是肯定的,使用 del 语句即可实现,例如:
  1. #删除新添加的 money 实例变量
  2. del clanguage.money
  3. #再次尝试输出 money,此时会报错
  4. 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 对象动态添加其它方法。

需要注意的一点是,为 clanguage 对象动态增加的方法,Python 不会自动将调用者自动绑定到第一个参数(即使将第一个参数命名为 self 也没用)。例如如下代码:
  1. # 先定义一个函数
  2. def info(self):
  3. print("---info函数---", self)
  4. # 使用info对clanguage的foo方法赋值(动态绑定方法)
  5. clanguage.foo = info
  6. # Python不会自动将调用者绑定到第一个参数,
  7. # 因此程序需要手动将调用者绑定为第一个参数
  8. clanguage.foo(clanguage) # ①
  9. # 使用lambda表达式为clanguage对象的bar方法赋值(动态绑定方法)
  10. clanguage.bar = lambda self: print('--lambda表达式--', self)
  11. clanguage.bar(clanguage) # ②
上面的第 5 行和第 11 行代码分别使用函数、lambda 表达式为 clanguage 对象动态增加了方法,但对于动态增加的方法,Python 不会自动将方法调用者绑定到它们的第一个参数,因此程序必须手动为第一个参数传入参数值,如上面程序中 ① 号、② 号代码所示。

有读者可能会问,有没有不用手动给 self 传值的方法呢?通过借助 types 模块下的 MethodType 可以实现,仍以上面的 info() 函数为例:
  1. def info(self,content):
  2. print("C语言中文网地址为:%s" % content)
  3. # 导入MethodType
  4. from types import MethodType
  5. clanguage.info = MethodType(info, clanguage)
  6. # 第一个参数已经绑定了,无需传入
  7. clanguage.info("http://c.biancheng.net")
可以看到,由于使用 MethodType 包装 info() 函数时,已经将该函数的 self 参数绑定为 clanguage,因此后续再使用 info() 函数时,就不用再给 self 参数绑定值了。

标签:变量,Python,创建,self,对象,实例,clanguage
From: https://www.cnblogs.com/qlsh/p/16804086.html

相关文章

  • 域对象共享数据
    1、使用ServletAPI向request域对象共享数据@RequestMapping("/testServletAPI")publicStringtestServletAPI(HttpServletRequestrequest){request.setAttribute("te......
  • 如何选择数据存储空间?华为云对象存储服务,让你省心又划算
     上至大企业,下至普通用户,在平日里都习惯将一些重要的文件存储在网络云盘上,这样才便捷日常的使用,随意翻出来查看也省时,畅享移动的数据存储魅力。来自华为云的对象存储服务......
  • python基础入门之模块
    python基础入门之模块索引取值与迭代取值的差异l1=[11,22,33,44,55]1.索引取值print(l1[2])#33 可以任意位置任意次数取值,不支持无序类型的数据取值。2.迭......
  • python模块/导入模块
    索引取值与迭代取值的差异l1=[1,2,3,4,5]1.索引取值可以任意位置任意次数的取值不支持无序类型的数据取值print(l1[3])print(l1[3])#可以直接获取任意位置的......
  • 进入python的世界_day17_python基础——了解模块、如何使用和导入模块、包的原理
    一、模块介绍1.什么是模块​ 其实我们前一阵已经接触过了,importxxx、fromxximportxxx​ 能够有一定功能的集合体就是模块,比如有某些功能的py文件,包含这个文件的......
  • python中展示json数据不换行(手动换行)
    https://blog.csdn.net/chichu261/article/details/82784904Settings—>keymap—>在搜索框输入wraps—>选择UseSoftWraps—>之后设置快捷键就可以了。针对第......
  • Python基础17
    今日内容概要索引取值与迭代取值的差异模块简介模块分类导入模块的两种句式导入模块补充说明循环导入问题判断文件类型模块的查找顺序绝刀导入与相对导入包概述......
  • Python爬虫(学习笔记)
    Python爬虫(学习笔记)  常见的反爬机制及应对策略名称描述解决方案/反反爬措施1.Headers 从用户的headers进行反爬是最常见的反爬策略,Headers是......
  • 【Python】第3章-7 求最大值及其下标
    本题要求编写程序,找出给定的n个数中的最大值及其对应的最小下标(下标从0开始)。输入格式:输入在第一行中给出一个正整数n(1<n≤10)。第二行输入n个整数,用空格分开。输出格式......
  • Python 2 数据类型
    关键字规则变量定义使用#作者:咸瑜#代码时间:2022/10/1715:57name="咸瑜"print('值',name)print('id',id(name))print('类型',type(name))......