51工具盒子

依楼听风雨
笑看云卷云舒,淡观潮起潮落

Python 封装解析

Python 封装技术是一种面向对象编程的重要概念,它允许将数据和相关操作封装在一个单独的单元中,以实现代码的重用和数据保护。主要内容如下:

  1. 属性

  2. 访问权限

  3. 方法

  4. 魔术方法

  5. 属性 {#title-0} ================

Python 中的属性表示在类中定义的数据变量,它共有两种类型的属性:类属性、实例属性。类属性是所有该类型实例对象共享,而实例属性只归属于实例对象。


# 1. 实例属性
class Demo:
    # 构造函数
    def __init__(self):
        # 初始化时绑定实例属性
        self.v1 = 200

demo = Demo()
demo.v2 = 300  # 使用时按需绑定实例属性
print(demo.v1, demo.v2)


# 2. 类属性
class Test:
    # 初始化类时绑定类属性
    v1 = 300

# 使用时按需绑定类属性
Test.v2 = 400


t1 = Test()
t2 = Test()
print(t1.v1, t2.v1, Test.v1)
print(t1.v2, t2.v2, Test.v2)

# t2.v1 = 600  # 注意, 这是绑定实例属性,并不是修改类属性
Test.v2 = 500  # 通过类名访问才能修改

print('-' * 20)
print(t1.v1, t2.v1, Test.v1)
print(t1.v2, t2.v2, Test.v2)

# 注意: 当实例属性、类属性名冲突时,通过实例属性优先访问实例属性
  1. 访问权限 {#title-1} ==================

在很多支持面向对象技术的语言中,一般都会提供类似 public、protected、private 关键字来设定成员的访问权限。而在 Python, 访问权限主要是一种命名约定,而不是强制执行。即使是私有成员,仍然可以通过特定的命名规则进行访问。具体来说,可以使用以下规则来访问私有成员:

  1. 公有访问权限:一般没有特殊的修饰方式
  2. 保护访问权限:属性名使用单下划线开头
  3. 私有访问权限:属性名使用双下划线开头

另外,需要注意的是,无论是类属性还是实例属性都可以拥有访问控制权限。

class Demo:

    # 类属性
    public_v1 = 100
    _protected_v1 = 200
    __private_v1 = 300

    def __init__(self):
        # 实例属性
        self.public_v2 = 100
        self._protected_v2 = 200
        self.__private_v2 = 300


demo = Demo()
# 访问不同权限成员
print(demo.public_v2)
print(demo._protected_v2)
print(demo._Demo__private_v2)
  1. 方法 {#title-2} ================

Python 类中定义的方法分为三种:

  1. 类方法
  2. 实例方法
  3. 静态方法

类方法用于封装类属性,实例方法用于封装实例属性,静态方法则是类作用域的普通方法。

class Demo:

    # 类属性
    __v1 = 100

    def __init__(self):
        self.__v2 = 200

    # 实例方法
    def set_v2(self, value):
        self.__v2 = value

    def get_v2(self):
        return self.__v2

    # 类方法
    @classmethod
    def set_v1(cls, value):
        cls.__v1 = value

    @classmethod
    def get_v1(cls):
        return cls.__v1

    # 静态方法
    @staticmethod
    def my_function():
        print('静态方法只能访问类属性', Demo.__v1)


# 1. 类方法调用
print(Demo.get_v1())
Demo.set_v1(200)
print(Demo.get_v1())

# 2. 实例方法调用
demo = Demo()
print(demo.get_v2())
demo.set_v2(300)
print(demo.get_v2())

# 3. 静态方法调用
demo.my_function()
Demo.my_function()
  1. 魔术方法 {#title-3} ==================

Python 中的魔术方法(Magic Methods),魔术方法有两个特点:

  1. 大多常用的魔术方法以两个下划线开始、两个下划线结束
  2. 魔术方法用于实现对象的特定行为和操作

下面给出常用魔术方法的使用示例:

class Demo:

    # 类属性
    __v1 = 100

    # 1. 构建对象时自动调用
    def __init__(self):
        print('初始化操作')

    # 2. 使用print函数时自动调用,必须返回字符串
    def __str__(self):
        return 'abc'

    # 3. 使用len函数时自动调用,必须返回整型
    def __len__(self):
        return 100

    # 4. 使用下标语法,返回任意类型
    def __getitem__(self, item):
        return 'hello world'

    # 5. 对象使用+运算符时调用,返回任意类型
    def __add__(self, other):
        return 666

    # 6. 对象使用<运算符时调用,返回任意类型
    def __lt__(self, other):
        return True



demo1 = Demo()
print(demo1)
print(len(demo1))
print(demo1[0], demo1[9999])

demo2 = Demo()
print(demo1 + demo2)
print(demo1 < demo2)
# 虽然未增加 >、== 运算符对应的魔术方法,Python 可由<运算符推断出来
# 但是如果只增加==运算符,<、> 是无法进行比较
print(demo1 > demo2)
print(demo1 == demo2)
赞(0)
未经允许不得转载:工具盒子 » Python 封装解析