一、基本概念
- 私有成员变量: __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还有很多有趣的魔法方法,详见下面链接