8-基础语法(7)

class类、function方法

  • 封装
  • 继承
  • 多态
class Student():
    name = "bidding."
    age = 12
    
print(Student.__dict__)

a = Student()
print(a.__dict__)
print(a.name)
print(a.age)

print(id(Student.name))
print(id(a.name))
{'__module__': '__main__', 'name': 'bidding.', 'age': 12, '__dict__': <attribute '__dict__' of 'Student' objects>, '__weakref__': <attribute '__weakref__' of 'Student' objects>, '__doc__': None}
{}
bidding.
12
1834479109552
1834479109552

封装

  • 三个级别:public、protected、private
  • 如果类中变量之前加了双下划线,则表示该变量是私有变量,实例不可访问

继承

  • 任何类都有一个共同的父类object
  • 子类可以继承父类中除私有成员外的所有
  • 子类继承父类,实际是子类引用了父类中对应成员的地址,并不是真的赋值
  • 子类调用父类的成员:super.成员 或者 父类名.成员
  • 子类没有定义构造函数时,自动继承父类的构造函数
class Person():
    name="xiaoming"
    age=12
    def sleep(self):
        print("sleeping .....")
        
class Teacher(Person):
    pass

t=Teacher()
print(t.name)
print(t.age)
xiaoming
12

单继承和多继承

  • 单继承:每个类只能继承一个类
  • 多继承:每个类允许继承多个类

优缺点:

  • 单继承:

    • 类的功能不能无限扩展
  • 多继承:

    • 功能无限扩展,但是关系混乱

多重继承导致的经典问题:

  • 菱形继承:多个类继承自一个父类,这些子类又被同一个类继承

  • 钻石继承:

  • 关于多继承的MRO:

    • MRO就是多继承中,用于保存继承顺序的一个列表
    • MRO的计算原则:
      • 子类永远在父类前面
      • 如果多个父类,则根据继承语法括号内的顺序存放
      • 如果多个类继承自同一个父类,则该父类只被存放一次

构造函数的调用顺序

  • 子类先查找自己,没有就找父类的,直到找到为止

多态

  • 多态就是同一个对象在不同情况下以不同的状态出现
  • 是一种设计模式

Mixin设计模式

  • 以多继承方式对类的功能进行扩展

类相关函数

issubclass:检测一个类是否是另一个类的子类

isinstance:检测对象是否是类的实例

hasattr:检测对象是否有某个成员

getattr:获取类的某个成员

setattr:设置类的成员

delattr:删除类的成员

类的内置属性

  • __ dict __:字典的方式显示类的成员组成
  • __ doc __:查看类的说明文档
  • __ name __:获取类的名称或模块的名称
  • __ bases __:获取类的所有父类,以元组的形式展现

类的常用魔术方法

  • 特定的时刻自动触发的一些方法
  • 方法名前后都有两个下划线
  • 常用魔术方法:
    • 操作类相关:
      • __ init __:构造函数,类的初始化,类实例化的时候自动调用
      • __ new __:类实例化的时候第一个被调用的方法,一般不用
      • __ call __:类的实例以方法使用的时候,默认调用该方法,如果没有该方法,会报错
      • __ str __:类的实例以字符串形式使用的时候,默认调用
      • __ repr :类似于 str __
    • 类描述符相关:
      • __ set __:
      • __ get __:
      • __ delete __:
    • 属性操作相关:
      • __ getattr __:访问一个不存在的属性时触发
      • __ setattr __:给不存在的属性赋值时触发,三个参数:self、attr、value,在该方法中不能直接对属性赋值,否则进入死循环;而是使用super.setattr()来赋值
    • 运算类相关:
      • __ gt __:进行大于判断的时候触发
      • __ lt __:进行小于判断的时候触发

类和对象的三种方法

  • 实例方法:实例化对象才能使用
  • 静态方法:通过类直接访问,实例也可以调用
  • 类方法:通过类直接访问,实例也可以调用
发布了247 篇原创文章 · 获赞 23 · 访问量 9万+

猜你喜欢

转载自blog.csdn.net/LiyangBai/article/details/102754438