python类的定义与使用
类仅仅充当图纸的作用,本身并不能直接拿来用,而只有根据图纸造出的实际物品(对象)才能直接使用。因此,Python 程序中类的使用顺序是这样的:
- 创建(定义)类,也就是制作图纸的过程;
- 创建类的实例对象(根据图纸造出实际的物品),通过实例对象实现特定的功能。
类的定义
无论是类属性还是类方法,对于类来说,它们都不是必需的,可以有也可以没有。另外,Python 类中属性和方法所在的位置是任意的,即它们之间并没有固定的前后次序.
class 类名:
多个(≥0)类属性...
多个(≥0)类方法...
"""定义一个空类"""
class Empty:
pass
类属性: 指的就是在各个类方法之外定义的变量,称为类属性或类变量
类方法: 指的是包含类中的函数
实例属性:指的是在类方法中定义的属性,称为实例属性或实例变量
_ _ init _ _() 方法
该方法是一个特殊的类实例方法,称为构造方法(或构造函数),用于创建对象时使用,每当创建一个类的实例对象时,Python 解释器都会自动调用它。
类的使用
定义的类只有进行实例化,也就是使用该类创建对象之后,才能得到利用。实例化后的类对象可以执行以下操作:
- 访问或修改类对象具有的实例变量,甚至可以添加新的实例变量或者删除已有的实例变量;
- 调用类对象的方法,包括调用现有的方法,以及给类对象动态添加方法。
class Students:
name = 'Jim'
age = 10
def __init__(self, name, age):
self.name = name
self.age = age
def say(self, content):
print(content)
student = Students(name='Tom', age=11) # 实例化一个对象
使用类属性
print(student.name, student.age) # 打印实例变量的值
student.name = "Lucy" # 修改实例变量的值
student.age = 15
student.say("天生我才必有用") # 调用实例的say()方法
print(student.name, student.age) # 再次打印实例变量的值
打印的内容:
Jim 10
天生我才必有用
Lucy 15
动态添加/删除类属性
student.money = 200 # 增加一个money实例变量
print(student.money)
del student.money # 删除新添加的 money 实例变量
print(student.money) # 再次尝试输出 money,此时会报错
打印内容:
200
Traceback (most recent call last):
File "/tests.py", line 53, in <module>
print(student.money)
AttributeError: 'Students' object has no attribute 'money'
动态添加类方法
"""方法一"""
def info(self): # 先定义一个函数
print("---info函数---", self)
student.foo = info # 使用info对student的foo方法赋值(动态绑定方法)
student.foo(student) # Python不会自动将调用者绑定到第一个参数,因此程序需要手动将调用者绑定为第一个参数
运行结果:
---info函数--- <__main__.Students object at 0x106d37588>
"""方法二"""
student.bar = lambda self: print('--lambda表达式--', self) # 使用lambda表达式为student对象的bar方法赋值(动态绑定方法)
student.bar(student)
运行结果:
--lambda表达式-- <__main__.Students object at 0x106d37588>
有没有不用手动给 self 传值的方法呢?通过借助 types 模块下的 MethodType 可以实现
"""方法三"""
def info(self, content):
print("本博客中文网地址为:%s" % content)
from types import MethodType # 导入MethodType
student.info = MethodType(info, student) # 由于使用 MethodType 包装 info() 函数时,已经将该函数的 self 参数绑定为 student,因此后续再使用 info() 函数时,就不用再给 self 参数绑定值了。
student.info("https://www.cnblogs.com/bigcarcar") # 第一个参数已经绑定了,无需传入
运行结果:
本博客中文网地址为:https://www.cnblogs.com/bigcarcar