Python面向对象编程:私有成员,保护成员和普通成员;抽象基类与继承

一、基本概念

  • 私有成员变量: __foo: 双下划线的表示的是私有类型(private)的变量, 只能是允许这个类本身进行访问了。
  • 保护成员变量: _foo:以单下划线开头的表示的是 protected 类型的变量,即保护类型只能允许其本身与子类进行访问,不能用于 from module import *
  • 普通成员变量:foo 类外可访问。
  • 私有方法:__private_method:两个下划线开头,声明该方法为私有方法,不能在类的外部调用
  • 普通方法:开头无下划线
  • 抽象基类:该类的方法均为抽象方法,不能被实例化。子类需实现所有抽象方法,不然子类也是抽象类
  • 方法重写:如果从父类继承的方法不能满足子类的需求,可以对其进行改写,这个过程叫方法的覆盖(override),也称为方法的重写。
  • 方法重载:重载(overload) 是在一个类里面,方法名字相同,而参数不同。
  • 魔法方法:Python 的对象天生拥有一些神奇的方法,他们总被双下划线锁包围,他们是面向对象的python的一切.

下面是一个例子:

from abc import ABC, abstractmethod
import math
# 抽象基类
class Shape(ABC):
    @abstractmethod
    def getArea():pass  #定义获取面积的抽象方法


class Triangle(Shape):
    __a = 10      #私有成员变量  __ 可理解成 private
    _b = 10.0     #保护成员变量  _ 可理解成 protected
    c = 10        #普通成员变量  可理解成 public

    # 构造器或称构造方法
    def __init__(self, a=0, b=0, c=0):
        if not self.__isLegal(a, b, c):
            raise Exception("illegal")
        self.__a = a
        self._b = b
        self.c = c
    
    # 析构器或称析构方法
    def __del__(self):
      class_name = self.__class__.__name__
      print(class_name, "销毁")

    def getArea(self):
        return math.sqrt((self.__a+self._b+self.c)*(self.__a+self._b-self.c)*\
           (self.__a+self.c-self._b)*(self._b+self.c-self.__a))/4

    # 私有方法, 无法类外访问
    def __isLegal(self, a, b, c):
        if a+b>c and a+c>b and b+c>a:
            return True
        else:
            return False

    # 魔法方法
    def __str__(self):
        return "triangle"


if __name__ == '__main__':
    triangle = Triangle(3,4,5)
    print(triangle.__a)
    # 报错,不能类外访问
    print(triangle._b)
    # 可以类外访问
    # >>4
    print(triangle.c)
    # >>5
    print(triangle.getArea())
    # >> 6.0
    print(triangle.__isLegal())
    # 报错,不能类外访问
    print(str(triangle))
    # >>triangle

  我们看到__str__是一个魔法方法,可以通过str(object)来访问,python还有很多有趣的魔法方法,详见下面链接

  https://blog.csdn.net/qq_40765537/article/details/105198573

你可能感兴趣的:(python)