python类的定义与使用

类仅仅充当图纸的作用,本身并不能直接拿来用,而只有根据图纸造出的实际物品(对象)才能直接使用。因此,Python 程序中类的使用顺序是这样的:

  1. 创建(定义)类,也就是制作图纸的过程;
  2. 创建类的实例对象(根据图纸造出实际的物品),通过实例对象实现特定的功能。

类的定义

无论是类属性还是类方法,对于类来说,它们都不是必需的,可以有也可以没有。另外,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
posted @ 2022-05-03 00:20  大切切  阅读(1239)  评论(0编辑  收藏  举报