Python面向对象

2020/03/12 Python 共 1782 字,约 6 分钟

python面向对象 Object Oriented

类和对象

实例成员

  1. 实例变量
    作用:描述所有对象的共有数据
    说明:

    通常在构造函数__init__中创建
    __dict__:用于存储自身实例变量的字典
    特殊的:可在外部定义(一般用不到)

  2. 实例方法
    作用:表示对象行为
    说明:

    至少有一个形参,第一个参数绑定调用这个方法的对象,一般命名为”self”
    无论创建多少对象,方法只有一份,并且被所有对象共享
    不建议通过类名访问实例方法(要传入实例)

类成员

  1. 类变量
    作用:描述所有对象的共有数据
    说明:

    只有一份,被所有对象共享
    不建议通过对象访问类变量

  2. 类方法
    作用:操作类变量
    说明:

    至少有一个形参,第一个形参用于绑定类,一般命名为’cls’
    使用@classmethod修饰的目的是调用类方法时可以隐式传递类
    类方法中不能访问实例成员,实例方法中可以访问类成员
    不建议通过对象访问类方法

  3. 静态方法
    作用:一般用来定义常用的工具函数
    说明:

    使用@ staticmethod修饰的目的是该方法不需要隐式传参数
    静态方法不能访问实例成员和类成员
    不建议通过对象访问静态方法

封装

  1. 私有成员
    作用:无需向类外提供的成员,可以通过私有化进行屏蔽
    说明:

    障眼法,实际也可以访问
    私有成员的名称被修改为:_类名__成员名,可以通过_dict_属性或dir函数

  2. __slots__
    作用:限定一个类创建的实例只能有固定的实例变量,不能再额外添加
    说明:

    含有__slots__属性的类所创建的对象没有__dict__属性, 即此实例不用字典来存储对象的实例属性
    对继承的子类不起作用

  3. 属性@property
    作用:方便操作私有变量
    说明:

    @property 负责读取
    @属性名.setter 负责写入
    方法中可自行加入逻辑

继承与多态

注意要点:

  1. 父类某方法中加入raise NotImplementedError(),则子类必须重写这个方法

  2. 方法在子类中未找到时,从左到右查找父类中是否包含方法

  3. isinstance() 用于检查实例类型;issubclass() 用于检查类继承

  4. def __str__(self):将对象转换为字符串(对人友好的)

  5. def __repr__(self):将对象转换为字符串(解释器可识别的)

附

class MyClass:
    a = 1  # 类变量,只有一份,所有对象共享

    def __init__(self):
        self.a = 3  # 实例变量
        self.b = 4  # 每次实例化就创建一次

    @property
    def b(self):
        # 读取或格式化保护数据,可以加读取条件
        return self.__b
        # 如果b为可变对象,可以考虑切片
        # return self.__b[:]

    @b.setter
    def b(self, value):
        # 写入或格式化保护数据,可以加写入条件
        self.__b = value

    def __str__(self):
        # __str__默认调用__repr__,返回实例信息
        return '__str__返回 ' + str(self.a)

    def test_method(self):
        print('test_method', self.a)
        self.__private_method()  # 调用私有方法

    def __private_method(self):
        print('private_method', self.a)

    @staticmethod
    def static_method():
        # 静态方法无法访问类成员和实例成员
        # 只能通过类名访问,但这样会造成硬编码,不推荐
        print('static_method', MyClass.a)

    @classmethod
    def class_method(cls):
        # 类方法可以访问类成员,无法访问实例成员
        print('class_method', cls.a)


if __name__ == '__main__':
    test = MyClass()
    # 打印实例对象时调用__str__
    print(test)
    # __dict__只能获取自身成员
    print(MyClass.__dict__)
    print(test.__dict__)
    # 读写实例的成员变量
    test.b = 5
    print(test.b)

    # 只有类内部才能访问私有方法
    # test.__private_method()
    test.test_method()
    # 调用类方法和静态方法时无需实例化
    test.class_method()
    test.static_method()

文档信息

Search

    Table of Contents