隐藏属性 - 单/多继承 - 多态与多态性

隐藏属性

类属性,方法,对象属性都可以被隐藏

如何隐藏 

在类定义阶段隐藏,把名字发生变形,属性名或者方法名的前面加_ _ (设置成私有的)

注意事项:

  1. 在类外部无法直接访问双下划线开头的属性,但知道了类名和属性名就可以_类名_ _属性,然后就可以访问,没有严格意义上的限制外部访问
  2. 在类内部是可以直接访问双下划线开头的属性,比如self._ _f1()
  3. 变形只在类定义阶段发生一次,在类定义之后的赋值操作,不会变形

为什么要隐藏

将数据隐藏起来限制类外部对数据的直接操作,然后类内部提供相应的接口来允许类外部间接的操作数据,接口之上可以附加额外的逻辑来对数据的操作进行严格的控制

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. 先从对象自己的名称空间中去查找
  2. 再从产生这个对象的类中查找
  3. 去继承的父类中继续依次往上查找
  4. 在查找的过程中,如果找到一个,就不再继续往下找

多继承下的属性查找 

多继承就是括号里面可以有多个父类,继承的父类里面也可以有多个父类

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())

 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值