python类的创建及调用_Python学习06.04:Python类对象的创建和使用

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

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

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

# 创建类实例,但并没有创建变量引用实例

类名(参数)

# 创建类实例,创建变量引用类实例

vairable = 类名(参数)

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

例如,如下代码创建了名为 CLanguage 的类,并对其进行了实例化:

class CLanguage :

# 定义了2个类字段

name = "C语言中文网"

add = "http://c.biancheng.net"

def __init__(self,name,add):

# 定义2个实例字段,字段为public属性

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)

# 修改实例字段的值,name和add字段是public字段

clanguage.name="Python教程"

clanguage.add="http://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) # ①

# 错误示例,调用时传入self和默认不填写均会报错作为self

# clanguage.foo(self)

# clanguage.foo()

# 使用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 参数绑定值了。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值