夜间模式暗黑模式
字体
阴影
滤镜
圆角
主题色
Python学习笔记5-类

类(P114)

Python的类感觉和C/C++有点不太一样, 虽然基本的东西是是一样的, 但怪怪的

  • 类定义里面可以写语句…

  • Python类成员函数第一个参数是调用这个参数的类实例, 一般命名为’self’, 通过’对象.成员函数()’调用成员函数的时候不需要在括号内提供这个参数,调用的对象会作为第一个参数传给函数, 类似于C++中的this, 不过必须在定义是显式地作为第一个参数写出来, 调用的时候却又不需要显式的提供.

  • Python的类的属性(成员变量)如果定义直接在类里面(成员函数外面), 就类似C++里的static静态成员, 如果在一个函数定义的话, 才相当于C++里面的普通成员

  • Python没有提供对私有成员和保护成员的直接支持, 而是要通过其他的一些手段来实现:

    • 私有成员: 用__attrName双下划线开头命名, 这样外界就不能直接通过通过这个名字来访问(但实际还是能访问的, 添加双下划线的成员Python会将他们的名字__attrName改为_ClassName__attrName, 还可以直接用第二个名字直接访问)
    • 保护成员: 用_attrName单下划线开头命名, 但它依旧直接访问, 只是一个约定, 表明不建议直接从外部调用这个成员(但使用from module import * 将不会导入以下划线开头的名称)
  • Python类的继承与派生:

    • 当一个继承了多个父类的时候, 如果多个父类中有相同名字的成员, 父类列表中前面的类的变量将会覆盖后面的类的那个同名变量

    • 抽象基类: 不能被实例化, 使用下面的方法将类设置为抽象基类:

      from abc import ABC, abstractmethod
      
      class Person(ABC):
          @abstractmethod
          def set_name(self): pass
      
          def get_name(self): return name
      
          # 继承ABC说明这是个抽象基类
          # 使用@abstractmethod修饰, 说明这个方法必须在子类实现, 如果没有重写这个方法, 子类也会是个抽象基类
          
      
  • 构造函数和析构函数:

    • __init__(self[, args...]):通过obj = className(args)调用
    • __del__(self): 通过del obj调用
  • 派生类调用超类的方法(P148)

    • 调用未关联的 超类的构造函数:

      class Bird: pass
      
      class SongBird:
      	def __init__(self):
      		Bird.__init_(self)
              # 方法的self参数会自动关联到实例, 如果通过类调用方法, 就没有实例与之关联, 这样的方法称为未关联的, 可以显示设置参数self
      
      
    • 使用函数super

      def __init__(self):
          super().__init__()
          # 会调用所有超类的构造函数, 如果有多个超类派生自同一个祖先类, 也能自动处理
          # super()返回一个super对象, 负责执行方法解析, 当访问super对象的属性时, 它会在所有超类(以及超类的超类等等)中寻找知道找到或引发AttributeError异常
          # super(类名, 实例), 对其调用方法时将调用超类的方法而不是当前类的方法
          
          
      # 示例
      class Bird:
          def __init__(self):
              print('Bird')
      
          def function(self):
              print("Bird f")
      
      class SongBird(Bird):
          def __init__(self):
              super().__init__()
              print('SongBird')
      
          def function(self):
              print('SongBird f')
      
      b = SongBird()
      b.function()
      super(SongBird, b).function()
      
      # 输出
      Bird
      SongBird
      SongBird f
      Bird f
      
      
  • 其他成员方法

    • __repr__(self)
    • __str__(self)__
  • 其他内置属性:

    • __dict__
    • __doc__
    • __name__
    • __module__: 类定义所在的模块
    • __bases__: 类的所有父类元素构成的元组
  • 其他一些关于类的函数:

    • 访问类属性的函数:

      getattr(obj, name[,default])
      hasattr(obj, name)
      setattr(obj, name, value)
      delattr(obj, name)
      
      callable(obj) # 判断obj是否可调用
      
    • 继承与派生:

      isinstance(obj, class) #obj是否是class的实例(或者子类的实例)
      issubclass(A, b) # A是否是B的子类
      type(obj) # 返回obj类型
      
      # 测试
      
      from abc import ABC, abstractmethod
      
      class Person(ABC):
          @abstractmethod
          def set_name(self, name): pass
      
          def get_name(self): return self.name
      
      class Student(Person):
          def set_name(self, name): self.name = name
      
      alice = Student()
      alice.set_name('Alice')
      print(alice.get_name())
      print(callable(alice.get_name()))
      print(isinstance(alice, Person))
      print(issubclass(Student, Person))
      print(type(Student), type(Person))
      
      # 输出
      Alice
      False
      True
      True
      <class 'abc.ABCMeta'> <class 'abc.ABCMeta'>
      
  • 习惯了严谨规范的C++, Python感觉很不习惯

暂无评论

发送评论 编辑评论


				
上一篇
下一篇