隐藏属性
类属性,方法,对象属性都可以被隐藏
如何隐藏
在类定义阶段隐藏,把名字发生变形,属性名或者方法名的前面加_ _ (设置成私有的)
注意事项:
- 在类外部无法直接访问双下划线开头的属性,但知道了类名和属性名就可以_类名_ _属性,然后就可以访问,没有严格意义上的限制外部访问
- 在类内部是可以直接访问双下划线开头的属性,比如self._ _f1()
- 变形只在类定义阶段发生一次,在类定义之后的赋值操作,不会变形
为什么要隐藏
将数据隐藏起来限制类外部对数据的直接操作,然后类内部提供相应的接口来允许类外部间接的操作数据,接口之上可以附加额外的逻辑来对数据的操作进行严格的控制
property装饰器
身高或体重是不断变化的,因而每次想查看BMI值都需要通过计算才能得到,但很明显BMI听起来更像是一个特征而非功能,为此Python专门提供了一个装饰器property,可以将类中的函数“伪装成”对象的数据属性,对象在访问该特殊属性时会触发功能的执行,然后将返回值作为本次访问的结果,例如
class People():
def __init__(self,name,weight,height):
self.name=name
self.weight=weight
self.height=height
@property
def bmi (self):
return self.weight / (self.height**2)
obj=People('lili',75,1.85)
print(obj.__dict__) # {'name': 'lili', 'weight': 75, 'height': 1.85}
print(obj.bmi) # 21.913805697589478
继承
在python中,新建的类可以继承一个或者多个父类,新建的类可称为子类或派生类,父类又称为基类或超类
class ParentClass1: #定义父类
pass
class ParentClass2: #定义父类
pass
class SubClass1(ParentClass1): #单继承
pass
class SubClass2(ParentClass1,ParentClass2): #多继承
pass
# 通过类的内置属性__bases__可以查看类继承的所有父类
print(SubClass2.__bases__)
# (<class '__main__.ParentClass1'>, <class '__main__.ParentClass2'>)
在Python2中有经典类与新式类之分,没有继承object类,以及该类的子类,都是经典类,继承object的类,以及该类的子类,都是新式类。在Python3中统一都是新式类
单继承下的属性查找
单继承,一个子类只能继承一个父类,括号里面只有一个类
- 先从对象自己的名称空间中去查找
- 再从产生这个对象的类中查找
- 去继承的父类中继续依次往上查找
- 在查找的过程中,如果找到一个,就不再继续往下找
多继承下的属性查找
多继承就是括号里面可以有多个父类,继承的父类里面也可以有多个父类
1.由对象发起的属性查找,会从对象自身的属性里检索,没有则会按照对象的类.mro()规定的顺序依次找下去,
2.由类发起的属性查找,会按照当前类.mro()规定的顺序依次找下去
多态多态性
多态
指的是同一种操作,对不同的对象可以有不同的响应,即不同的对象会有不同的表现形式
多态性
是面向对象编程中的一种重要特性,它可以提高代码的灵活性和可扩展性,使代码更加易于维护和复用。
在多态性中,一个基类可以有多个派生类,每个派生类都可以重写基类的方法,以实现自己的行为方式。当程序执行时,根据对象的实际类型来确定调用哪个方法,从而实现多态性。
例如,假设有一个形状(Shape)的父类,它有一个计算面积的方法,并有两个子类:矩形(Rectangle)和圆形(Circle)。在矩形类和圆形类中都可以重写父类的计算面积的方法,以计算出矩形或圆形的面积。
class Shape:
def calculateArea(self):
pass
class Rectangle(Shape):
def __init__(self, width, height):
self.width = width
self.height = height
def calculateArea(self):
return self.width * self.height
class Circle(Shape):
def __init__(self, radius):
self.radius = radius
def calculateArea(self):
return 3.14 * self.radius * self.radius
shapes = [Rectangle(4, 5), Circle(3), Rectangle(2, 3)]
for shape in shapes:
print("Area is:", shape.calculateArea())