python学习记录21

1 面向对象的三大特征

面向对象的三大特征为:封装、继承、多态。

(1)封装

封装是指在类的使用中对隐藏内部细节,只提供操作方法的操作。例如在定义实例方法时,你无法看到我这个方法是用什么函数描述的,但是知道我这个方法的名字和作用。目的是为了保证数据安全。这种封装也可以叫做权限控制。python中没有明确的权限访问修饰符,是通过对属性和方法添加单下划线、双下划线以及首尾下划线实现的

单下划线:这类成员只限内部访问,只允许类本身和子类去访问,但事实上外部代码还是可以强行访问的

双下划线:代表是私有成员,只允许定义该属性或方法的类本身访问,使用对象访问的方法有:

对象名._类名__方法或属性#不推荐

使用修饰词@property将方法转化为属性,此时属性值只能查看不能直接修改#推荐

首尾双下划线:特殊的方法(例如初始化方法)

python 复制代码
class Car:
    def __init__(self,name,price):
        self._name = name#受保护的对象
        self.__price = price#私有对象
    def _fun1(self):
        print('1')
    def __fun2(self):
        print("2")
    def sh(self):
        self._fun1()
        self.__fun2()
        print(self._name)
        print(self.__price)
a = Car('benz',40000)
print(a._name)
print(a._Car__price)#不推荐的方法
a._fun1()
a._Car__fun2()#不推荐的方法

使用修饰词进行属性控制,属性值可以使用setter方法去修改

python 复制代码
class Car:
    def __init__(self,name,price):
        self._name = name#受保护的对象
        self.__price = price#私有对象
    @property
    def jiage(self):
        return self.__price
    @jiage.setter#更改属性值
    def jiage(self,value):
        self.__price=value
a =Car('Benz',400000)
print(a._name,a.jiage)
b =Car("BMW",300000)
b.jiage =600000
print(b.jiage)

(2)继承

在函数调用时使用形参名=值的方式经行传参,这就是一种继承的方法。Python中可以用一个新类继承一个旧类,此时新类不仅拥有旧类的属性和方法,还能有自己的属性和方法。在Python中被继承的类称为父类或基类,继承的类叫做子类。一个子类可以继承多个父类(python特性),一个父类可以拥有多个子类。如果一个类没有继承任何类,则默认其继承的是object类。

继承的语法结构为:

class 继承的子类(父类1,父类2,......,父类N):

一个子类可以继承多个多个父类,以及多个父类的属性与方法,这个性质我们叫做多继承。

python 复制代码
class Car:
    def __init__(self,price):
        self.price =price
class Benz(Car):
    def __init__(self,price,version):
        super().__init__(price)#继承父类的初始属性
        self.version = version#自身的新属性
    def sh(self):
        print(self.version,self.price)
class BMW(Car):
    def __init__(self,price,version,sale):
        super().__init__(price)
        self.version =version
        self.sale =sale
    def sh(self):
        print(self.version, self.price,self.sale)
class Maybach(Benz):
    def __init__(self,price,version,host):
        super().__init__(price,version)
        self.host =host
class House:
    def __init__(self,name):
        self.house = name
class Person(Car,House):#多继承
    def __init__(self,price,name,xingming):
        Car.__init__(self,price)
        House.__init__(self,name)
        self.name = xingming
a = Car(560000)
b = Benz(400000,'GLC')
c = BMW(1200000,'Mpower',500)
d = Maybach(3000000,'GLS','xiaoming')
lst = [a,b,c,d]
for item in lst:
    print(item.price)
e = Person(500000,'biguiyuan','xiaohong')
print(e.price,e.house,e.name)

继承有一个功能称为方法重写,即子类在继承父类时,拥有父类所有对象,包括保护的与受保护的。但父类中的一些方法可能性并不能完全满足子类所需,此时子类可以对父类的方法进行重写。子类重新编写的方法的方法名必须与父类相同(继承),子类自行编写方法体(方法重写)。子类在重新编写父类的方法是使用super.xxx():调用父类的方法。但子类不一定需要继承父类的方法,可以自己完全重写,当系统发现方法时首先调查的是子类的方法。

python 复制代码
class Car:
    def __init__(self,price):
        self.price =price
    def show(self):#父类的方法
        print('价格为:',self.price)
class Benz(Car):
    def __init__(self,price,version):
        super().__init__(price)
        self.version = version
    def show(self):
        print(f'奔驰车的型号为:',self.version)#重写自己的方法以输出自己的属性
        super().show()  # 继承父类的方法
class BMW(Car):
    def __init__(self,price,version,sale):
        super().__init__(price)
        self.version =version
        self.sale =sale
    def show(self):
        print(f'宝马车的型号为:',self.version,f'已售出:',self.sale)#完全重写show方法
a = Benz(500000,'AMG')
a.show()
b = BMW(400000,'M3',300)
b.show()

(3)多态

多态指多种形态,在传参前不需要做出决定需要输入对象的类型,而是在调用对象方法时动态决定类型,即系统只在意这个对象是否具有这样的方法而不在意是否存在继承(java的继承与多态必不可少)。

python 复制代码
class Benz:
    def __init__(self,price):
        self.price =price

class BMW:
    def __init__(self,price):
        self.price =price

class AITO:
    def __init__(self,price):
        self.price =price

def fun(x):
    print(x.price)
a = BMW(100000)
b = Benz('100000')
c = AITO([500000,300000])
fun(a)
fun(b)
fun(c)
相关推荐
凳子花❀1 小时前
Vins_Fusion_gpu中source setup.bash
python·vins_fusion_gpu
岁岁岁平安1 小时前
Maven学习(Maven项目模块化。模块间“继承“机制。父(工程),子项目(模块)间聚合)
java·学习·maven·idea·继承·聚合·maven模块化
金增辉1 小时前
当前使用的PyCharm社区版版本号,配置镜像源时,没有manage repositories
ide·python·pycharm
B站计算机毕业设计超人1 小时前
计算机毕业设计Python+知识图谱大模型AI医疗问答系统 健康膳食推荐系统 食谱推荐系统 医疗大数据 机器学习 深度学习 人工智能 爬虫 大数据毕业设计
大数据·人工智能·python·深度学习·机器学习·知识图谱·数据可视化
Narutolxy1 小时前
️️️ 避坑指南:如何修复国密gmssl 库填充问题并提炼优秀加密实践20241212
python·密码学
加德霍克2 小时前
Opencv之识别图片颜色并绘制轮廓
图像处理·人工智能·opencv·学习·计算机视觉
LuckyLay2 小时前
Rust学习笔记_17——HashMap
笔记·学习·rust
为小三离家出走2 小时前
通过正则表达式来判断用户名是否合法
开发语言·python
肉包之2 小时前
OpenCV实验:图片加水印
人工智能·python·opencv·计算机视觉
梦境虽美,却不长2 小时前
C语言学习日志 结构体 2024/12/12
学习