python面向对象操作2(速通版)

news2024/12/22 22:54:11

目录

一、私有和公有属性的定义和使用

1.公有属性定义和使用

2.私有属性

二、继承

1.应用

2.子类不能用父类的私有方法

3.子类初始化父类

4.子类重写和调用父类方法

5.多层继承

6.多层继承-初始化过程

7.多继承基本格式

8.多层多继承时的初始化问题

9.多继承初始化传参问题

10.super简化写法

11.影响mro的顺序

12.调用父类两种方法

结语


一、私有和公有属性的定义和使用

1.公有属性定义和使用

公有属性会破坏封装性


class Account(object):
    def __init__(self,name,balance):
        self.name = name
        self.balance = balance

    def show_info(self):
        print(self.name + '有' + self.balance,"元")

jack = Account('JackMa',9999999)
print(jack.name)
print(jack.balance)

jack.name = '郭'
print(jack.name)
print(jack.balance)
class Account(object):
    def __init__(self,name,balance):
        self.name = name
        self.balance = balance

    def show_info(self):
        print(self.name + '有' + self.balance,"元")

jack = Account('JackMa',9999999)
print(jack.name)
print(jack.balance)

jack.name = '郭'
print(jack.name)
print(jack.balance)

2.私有属性

当一个类中的所有属性或方法,全是私有的时候,这个类时无意义的

class Account(object):
    def __init__(self,name,balance):
        self.__name = name
        self.__balance = balance

    def show_info(self):
        print(self.__name+'有',self.__balance,'元')

jack = Account('Jackma',99999999)

jack.show_info()

 私有属性set和get方法


class Account(object):
    def __init__(self,name,balance):
        self.__name = name
        self.__balance = balance

    def show_info(self):
        print(self.__name+'有',self.__balance,'元')

    def get_name(self):
        return self.__name

    def set_balance(self,new_b):
        if isinstance(new_b,int):
            self.__balance = new_b
        else:
            print("不能存放阴间的钱")
    def get_balance(self):
        return self.__balance

jack = Account('Jackma',99999999)

jack.show_info()
jack.set_balance(1000)
m = jack.get_balance()
print(m)
m -= 999
print(m)

二、继承

1.应用

 

class Phone(object):
    def call(self,number):
        print(f'正在给{number}打电话')


class iPhone(Phone):
    def carmera(self):
        print("拍照")

iphonex = iPhone()
iphonex.call('128447873929')
iphonex.carmera()

2.子类不能用父类的私有方法

class Father(object):
    def __init__(self):
        self.__money = 999
        self.name = 'tom'
    def __show(self):
        print("这个是父类中的一个私有方法")
    def display(self):
        print("这个是父类中的一个私有方法")

class Son(Father):
    def play(self):
        print("这是子类中的方法")
        #子类不能用父类的私有方法
        self.__show()

s = Son()
s.play()
s.display()

3.子类初始化父类

class Father(object):
    def __init__(self,name):
        self.__money = 999
        self.name = name


class Son(Father):
    pass

#子类初始化父类的init
s = Son('tom')
print(s.name)

但子类有init方法会无法初始化父类


class Father(object):
    def __init__(self,name):
        self.__money = 999
        self.name = name


class Son(Father):
    def __init__(self,age):
        self.age = age

#子类初始化父类的init
s = Son('tom')
print(s.name)

解决办法  就是手动init父类

4.子类重写和调用父类方法

class Father(object):
    def cure(self):
        print("父类")


class Son(Father):
    def cure(self):
        print("子类")


#子类初始化父类的init
s = Son()
s.cure()

class Father(object):
    def cure(self):
        print("父类")


class Son(Father):
    def cure(self):
        Father.cure(self)
        print("子类")


#子类初始化父类的init
s = Son()
s.cure()

5.多层继承

class A(object):
    def a(self):
        print('a function')

class B(A):
    def b(self):
        print('b function')

class C(B):
    def c(self):
        print('c function')

class D(C):
    def d(self):
        print('d function')


d = D()
d.a()
d.b()
d.c()
d.d()

方法重写

class A(object):
    def a(self):
        print('a function')

class B(A):
    def b(self):
        print('b function')

class C(B):
    #重写b
    def b(self):
        print('bc function')
    def c(self):
        print('c function')

class D(C):
    def d(self):
        print('d function')


d = D()
d.a()
d.b()
d.c()
d.d()

6.多层继承-初始化过程

class A(object):
    def __init__(self,a):
        self.a = a
class B(A):
    def __init__(self,a,b):
        A.__init__(self,a)
        self.b = b


class C(B):
    def __init__(self,a,b,c):
        B.__init__(self, a,b)
        self.c = c

class D(C):
    def __init__(self,a,b,c,d):
        C.__init__(self, a,b,c)
        self.d = d


d = D(1,2,3,4)
print(d.a,"  ",d.b,'    ',d.c,"  ",d.d)

7.多继承基本格式

class Father(object):
    def func_fa(self):
        print('Father Function')

class Mother(object):
    def func_mo(self):
        print('Mother function')

class Son(Father,Mother):
    def play(self):
        print('Son Play')

s = Son()
s.play()
s.func_mo()
s.func_fa()

8.多层多继承时的初始化问题

菱形继承

class Person(object):
    def __init__(self,aaa):
        print("Person")
        self.aaa = aaa

class Father(Person):
    def __init__(self,aaa,name):
        Person.__init__(self,aaa)
        print("Father")
        self.name = name

class Mother(Person):
    def __init__(self,aaa,age):
        Person.__init__(self, aaa)
        print("Mother")
        self.age = age

class Son(Father,Mother):
    def __init__(self,aaa,name,age,gender):
        print("Son")
        Mother.__init__(self,aaa,age)
        Father.__init__(self,aaa,name)
        self.gender =  gender

s = Son(1,'tom',12,'男')
print("______________________________________________________")
print(s.aaa)
print(s.name)
print(s.age)
print(s.gender)

 

菱形继承的问题如何解决呢?

super解决

让子类调用father,father调用mather,mather调用person,变成线性的


class Person(object):
    def __init__(self,aaa):
        print("Person")
        self.aaa = aaa

class Father(Person):
    def __init__(self,aaa,name,age):
        super(Father,self).__init__(aaa,age)
        print("Father")
        self.name = name

class Mother(Person):
    def __init__(self,aaa,age):
        super(Mother,self).__init__(aaa)
        print("Mother")
        self.age = age

class Son(Father,Mother):
    def __init__(self,aaa,name,age,gender):
        print("Son")
        super(Son,self).__init__(aaa,name,age)
        self.gender =  gender

s = Son(1,'tom',12,'男')
print("______________________________________________________")
print(s.aaa)
print(s.name)
print(s.age)
print(s.gender)

 super的执行过程

mro是个元组,元素的顺序是解释器定义的

注意根据这个列表我们可以得到son——father——mather——person这个顺序

如果顺序不对也会报错

class Person(object):
    def __init__(self,aaa):
        print("Person")
        self.aaa = aaa

class Father(Person):
    def __init__(self,aaa,name):
        super(Father,self).__init__(aaa)
        print("Father")
        self.name = name

class Mother(Person):
    def __init__(self,aaa,name,age):
        super(Mother,self).__init__(aaa,name)
        print("Mother")
        self.age = age

class Son(Father,Mother):
    def __init__(self,aaa,name,age,gender):
        print("Son")
        super(Son,self).__init__(aaa,name,age)
        self.gender =  gender

s = Son(1,'tom',12,'男')
print(Son.__mro__)

9.多继承初始化传参问题

class Person(object):
    def __init__(self,aaa):
        print("Person")
        self.aaa = aaa

class Father(Person):
    def __init__(self,name,*args):
        #这里不用担心传参的问题,因为这里会自动解包
        super(Father,self).__init__(*args)
        print("Father")
        self.name = name

class Mother(Person):
    def __init__(self,age,aaa):
        super(Mother,self).__init__(aaa)
        print("Mother")
        self.age = age

class Son(Father,Mother):
    def __init__(self,gender,name,age,aaa):
        print("Son")
        super(Son,self).__init__(name,age,aaa)
        self.gender =  gender

s = Son('男','tom',12,1)
print(Son.__mro__)
print(s.name)
print(s.age)
print(s.gender)
print(s.aaa)

10.super简化写法


class Person(object):
    def __init__(self,aaa):
        print("Person")
        self.aaa = aaa

class Father(Person):
    def __init__(self,name,*args):
        #这里不用担心传参的问题,因为这里会自动解包
        #super(Father,self).__init__(*args)
        super().__init__(*args)
        print("Father")
        self.name = name

class Mother(Person):
    def __init__(self,age,aaa):
        #super(Mother,self).__init__(aaa)
        super().__init__(aaa)
        print("Mother")
        self.age = age

class Son(Father,Mother):
    def __init__(self,gender,name,age,aaa):
        print("Son")
        #super(Son,self).__init__(name,age,aaa)
        super().__init__(name, age, aaa)
        self.gender =  gender

s = Son('男','tom',12,1)
print(Son.__mro__)
print(s.name)
print(s.age)
print(s.gender)
print(s.aaa)

11.影响mro的顺序

类的额继承书写顺序会影响mro的顺序,但不会改变mro的顺序

'''
多重多继承时,方法的查找顺序也参考MRO
'''

class A(object):
    pass


class B(A):
    pass

class C(A):
    pass

class D(B,C):
    pass


print(D.__mro__)

'''
多重多继承时,方法的查找顺序也参考MRO
'''

class A(object):
    pass


class B(A):
    pass

class C(A):
    pass

class D(C,B):
    pass


print(D.__mro__)

 最子类的参数书写顺序会影响mro的元素顺序

class A(object):
    def show(self):
        print('A show run ...')

class B(A):
    def show(self):
        print('B show run ...')

class C(A):
    def show(self):
        print('C show run ...')

class D(C,B):
    pass

print(D.__mro__)
D().show()

class A(object):
    def show(self):
        print('A show run ...')

class B(A):
    def show(self):
        print('B show run ...')

class C(A):
    def show(self):
        print('C show run ...')

class D(B,C):
    pass

print(D.__mro__)
D().show()

12.调用父类两种方法

super调用

class A(object):
    def show(self):
        print('A show run ...')

class B(A):
    def show(self):
        print('B show run ...')

class C(A):
    def show(self):
        super().show()
        print('C show run ...')

class D(C,B):
    pass

print(D.__mro__)
D().show()

直接调用

class A(object):
    def show(self):
        print('A show run ...')

class B(A):
    def show(self):
        print('B show run ...')

class C(A):
    def show(self):
        B().show()
        print('C show run ...')

class D(C,B):
    pass

print(D.__mro__)
D().show()

或者


class A(object):
    def show(self):
        print('A show run ...')

class B(A):
    def show(self):
        print('B show run ...')

class C(A):
    def show(self):
        B.show(self)
        print('C show run ...')

class D(C,B):
    pass

print(D.__mro__)
D().show()

因为B.show()的B不是一个对象实例

结语

上班时间不多,尽量多更新,点点赞吧!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/617453.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

云原生Docker Cgroups资源控制操作

资源控制 Docker 通过 Cgroup 来控制容器使用的资源配额,包括 CPU、内存、磁盘三大方面, 基本覆盖了常见的资源配额和使用量控制。 Cgroup 是 ControlGroups 的缩写,是 Linux 内核提供的一种可以限制、记录、隔离进程组所使用的物理资源(如…

Node服务器-express框架

1 Express认识初体验 2 Express中间件使用 3 Express请求和响应 4 Express路由的使用 5 Express的错误处理 6 Express的源码解析 一、手动创建express的过程: 1、在项目文件的根目录创建package.json文件 npm init 2、下载express npm install express 3、基本…

kafka3

分区副本机制 kafka 从 0.8.0 版本开始引入了分区副本;引入了数据冗余 用CAP理论来说,就是通过副本及副本leader动态选举机制提高了kafka的 分区容错性和可用性 但从而也带来了数据一致性的巨大困难! 6.6.2分区副本的数据一致性困难 kaf…

多模态学习

什么是多模态学习? 模态 模态是指一些表达或感知事物的方式,每一种信息的来源或者形式,都可以称为一种模态 视频图像文本音频 多模态 多模态即是从多个模态表达或感知事物 多模态学习 从多种模态的数据中学习并且提升自身的算法 多…

【k8s 系列】k8s 学习三,docker回顾,k8s 起航

k8s 逐渐已经作为一个程序员不得不学的技术,尤其是做云原生的兄弟们,若你会,那么还是挺难的 学习 k8s ,实践尤为重要,如果身边有自己公司就是做云的,那么云服务器倒是不用担心,若不是&#xff…

IMX6ULL PHY 芯片驱动

前言 之前使用 IMX6ULL 开发板时遇到过 nfs 挂载不上的问题,当时是通过更换官方新版 kernel 解决的,参考《挂载 nfs 文件系统》。 今天,使用自己编译的 kernel 又遇到了该问题,第二次遇到了,该正面解决了。 NFS 挂载…

18JS09——作用域

作用域 一、作用域1、作用域 二、变量的作用域1、变量作用域的分类2、全局变量3、局部变量4、全局变量和局部变量区别 三、作用域链 目标: 1、作用域 2、变量的作用域 3、作用域链 一、作用域 1、作用域 通常来说,一段程序代码中所用到的名字并不总是有…

python基础----06-----文件读写追加操作

一 文件编码概念 思考:计算机只能识别: 0和1,那么我们丰富的文本文件是如何被计算机识别,并存储在硬盘中呢? 答案:使用编码技术(密码本)将内容翻译成0和1存入。 常见编码有UTF8,gbk等等。不同的编码,将内…

vulnhub靶场之DC-3渗透教程(Joomla CMS)

目录 0x01靶机概述 0x02靶场环境搭建 0x03主机发现 0x04靶场渗透过程 ​ 0x05靶机提权 0x06渗透实验总结 0x01靶机概述 靶机基本信息: 靶机下载链接https://download.vulnhub.com/dc/DC-3-2.zip作者DCAU发布日期2020年4月25日难度中等 0x02靶场环…

【Flink】DataStream API使用之输出算子(Sink)

输出算子(Sink) Flink作为数据处理框架,最终还是需要把计算处理的结果写入到外部存储,为外部应用提供支持。Flink提供了很多方式输出到外部系统。 1. 连接外部系统 在Flink中我们可以在各种Fuction中处理输出到外部系统&#xf…

C#读写参数到APP.Config

C#读写参数到APP.Config 介绍程序Demo常见错误 介绍 系统在开发时,可能需要设置默认参数,比如数据库的链接参数,某个参数的默认数据等等。对于这些数据,可直接在app.config中读取。 在读写时,需要先了解configuratio…

echo命令在Unix中的作用以及其常见用法

在Unix系统中,"echo"是一个常用的命令,用于在终端或脚本中输出文本。它可以将指定的字符串或变量的值打印到标准输出,从而向用户提供信息或进行调试。 本文将详细介绍"echo"命令在Unix中的作用以及其常见用法。 基本语法…

Keras-3-实例1-二分类问题

1. 二分类问题 1.1 IMDB 数据集加载 IMDB 包含5w条严重两极分化的评论,数据集被分为 2.5w 训练数据 和 2.5w 测试数据,训练集和测试集中的正面和负面评论占比都是50% from keras.datasets import imdb(train_data, train_labels), (test_data, test_l…

UE5 Chaos破碎系统学习1

在UE5中,Chaos破碎系统被直接进行了整合,本篇文章就来讲讲chaos的基础使用。 1.基础破碎 1.首先选中需要进行破碎的模型,例如这里选择一个Box,然后切换至Fracture Mode(破碎模式): 2.点击右侧…

JAVA实现打字练习软件

转眼已经学了一学期的java了,老师让我们根据所学知识点写一个打字练习软件的综合练习。一开始我也不是很有思路,我找了一下发现csdn上关于这个小项目的代码也不算很多,所以我最后自己在csdn查了一些资料,写了这么一个简略版本的打…

【C++】——list的介绍及模拟实现

文章目录 1. 前言2. list的介绍3. list的常用接口3.1 list的构造函数3.2 iterator的使用3.3 list的空间管理3.4 list的结点访问3.5 list的增删查改 4. list迭代器失效的问题5. list模拟实现6. list与vector的对比7. 结尾 1. 前言 我们之前已经学习了string和vector&#xff0c…

Remix IDE已支持Sui Move在线开发

网页版Remix IDE与WELLDONE Code插件结合,让您无需本地设置或安装即可开始构建Sui应用程序。 不熟悉Sui的构建者可能想在正式配置开发环境之前,浅尝一下构建Sui应用程序。Remix IDE与WELLDONE Code插件组合,即可帮助构建者实现从浏览器窗口开…

JavaScript函数的增强知识

函数属性和arguments以及剩余参数 函数属性name与length ◼ 我们知道JavaScript中函数也是一个对象,那么对象中就可以有属性和方法。 ◼ 属性name:一个函数的名词我们可以通过name来访问; // 自定义属性foo.message "Hello Foo"…

Nginx 之 Tomcat 负载均衡、动静分离

一.详细安装及操作实例(Nginx 七层代理) 首先至少准备三台服务器 Nginx 服务器:192.168.247.131:80 Tomcat服务器1:192.168.247.133:80 Tomcat服务器2:192.168.247.134:8080 192.168.247.134:80811.部署Nginx 负载均…

微信自动回复怎么设置呢?

友友们 你们是否有以下这些烦恼 1、每天要手动点击“添加”按钮多次以通过大量好友? 2、你是否经常需要在多个微信帐号之间来回切换? 3、你的回复速度慢,导致客户流失率高? 4、为了及时回复,你总是需要带着多部手机出门&…