Python 面向对象高级--继承,方法重写,权限,类成员,实例成员

news2025/1/14 4:12:25

 1.继承入门

class 子类名(父类名):

面向对象中的继承: 指的是多个类之间的所属关系,即子类默认继承父类的所有属性和方法.

面向对象中继承的作用: 提高代码的复用率, 减少重复代码的书写.
 

class Animal():
    def __init__(self,name,age):
        self.name = name
        self.age = age

    def eat(self):
        print('动物吃饭')

    def sleep(self):
        print('动物睡觉')

# class 类名(父类名):  --  继承语法
class Cat(Animal):
    def catch_mouse(self):
        print('可以捉老鼠')

if __name__ == '__main__':
    c = Cat('tom',2)
    c.eat()
    c.sleep()
    c.catch_mouse()

 2.单继承和多继承

class 子类名(父类名1,父类名2):

注意:当一个类有多个父类的时候,默认使用第一个父类的同名属性和方法
 

class Fu():
    def study(self):
        print('望子成龙')

    def show(self):
        print('家长言行教育')

class Teacher():
    def study(self):
        print("老师会教学生一技之长")

    def interview(self):
        print('工资是靠面试谈来的')

class Zi(Fu,Teacher):
    pass

if __name__ == '__main__':
    z = Zi()
    # 注意:当一个类有多个父类的时候,默认使用第一个父类的同名属性和方法。
    z.study()#望子成龙
    z.show()
    z.interview()

3.子类和父类定义同名属性


class Fu():
    def __init__(self):
        print('--父类init走了--')
        self.name = '父亲'

class Zi(Fu):
    def __init__(self):
        print('--子类init走了--')
        # super()表示父类的对象.
        super().__init__()
        self.name = '孩子'

if __name__ == '__main__':
    z = Zi()
    print(z.name)# 孩子  ---子类和父类具有同名属性和方法,默认使用子类的同名属性和方法

 4.子类和父类定义同名方法(覆盖)

# 类和父类具有同名属性和方法,默认使用子类的同名属性和方法
class Fu():
    def fall_in_love(self):
        print('写一封情书')

class Zi(Fu):
    def fall_in_love(self):
        print('玩微信')

if __name__ == '__main__':
    z = Zi()
    z.fall_in_love()#玩微信

 5.super()调用父类方法

# 类和父类具有同名属性和方法,默认使用子类的同名属性和方法
class Fu():
    def fall_in_love(self):
        print('写一封情书')

class Zi(Fu):
    def fall_in_love(self):
        # 子类觉得父类的功能还有用.但是不是完全可行.
        # 在这里想要调用父类的功能.
        #方式1:类名调用类中的函数(self)
            #Fu.__init__(self)
            #Fu.fall_in_love(self)

        #方式2: super()调用父类方法.
        super().fall_in_love()

        print('玩微信')

if __name__ == '__main__':
    z = Zi()
    z.fall_in_love()#玩微信

    print(Zi.__mro__) # 查看类中继承关系拓扑图
   #  (<class '__main__.Zi'>, <class '__main__.Fu'>, <class 'object'>)

 6.多层继承

class A(object):
    def show(self):
        print('aaa')

class B():
    def show(self):
        print('bbb')

class C(A,B):
    def show(self):
        print('ccc')

class D(C):
    def show1(self):
        print('ddd')

if __name__ == '__main__':
    print(D.__mro__) 
    #(<class '__main__.D'>, <class '__main__.C'>, <class '__main__.A'>, <class '__main__.B'>, <class 'object'>)
    d = D()
    d.show()# ccc

7.私有权限

class Person():
    # 属性:name和age
    def __init__(self, name, age):
        self.name = name
        # 给 age 变量 加上私有属性-- 超出本类无法访问.
        self.__age = age

 

    def __str__(self):
        return f'我的名字是:{self.name},我的你年龄是:{self.__age}'

    # 公开的设置年龄的方法--- 可以加上校验
    def set_age(self,age):
        if age > 0 and age < 200:
            self.__age = age

    # 公开的返回私有变量age的值.
    def get_age(self):
        return self.__age

 #学生类继承父类
class Student(Person):
    pass


if __name__ == '__main__':
    p1 = Person('tom',19)
    print(p1)
    #过了一年.tom长大一岁.结果手抖了.多敲一个0
    #p1.age = 200

    #print(p1.age)#AttributeError: 'Person' object has no attribute 'age'
    p1.set_age(20)
    print(p1.get_age())#20

    s = Student("tom",19)
    #私有属性 --子类通过继承--无法获取.
   # print(s.age)#AttributeError: 'Student' object has no attribute 'age'
   # print(s.__age)#AttributeError: 'Student' object has no attribute '__age'

 8.多态

class Animal():
    def eat(self):
        print('动物吃饭')

class Cat(Animal):
    def eat(self):
        print('猫吃鱼')

class Dog(Animal):
    def eat(self):
        print('狗吃肉')

class XXX():
    def eat(self):
        print('外星动物--风餐露宿')

# 变量: 类型  ==  对类型解释
def feed(a:Animal):
    a.eat()

if __name__ == '__main__':
    a = Animal()
    feed(a)
    #创建猫对象--猫对象是动物的子类
    c = Cat()
    feed(c)

    d = Dog()
    feed(d)

    x = XXX()
    feed(x)

 9.类属性和实例属性

- 类属性: 
  - 定义在类中,方法外. 
  - 属于类可以用类名调用. 
  - 所有对象共享一个类属性.可以访问不能修改.
- 实例属性:
  - 一般情况定义在__init()函数中
  - 属于对象.可以用对象名调用.
  - 实例属性属于对象.每个对象单独有一份自己的实例属性.
 

class Student():
    # 类属性 == 学校名称
    school_name = '黑马'

    def __init__(self,name,age):
        # 实例属性
        self.name = name
        self.age = age

if __name__ == '__main__':

    #类属性 ,用类名就可以调用
    print(Student.school_name)
    Student.school_name = '黑马程序员'

    #实例属性需要用对象来调用
    s1 = Student('小明',19)
    print(s1.name,s1.age,s1.school_name)

    # 使用对象修改类属性--不能生效
    #s1.school_name = '传智教育'  # 实际是给 s1 对象添加了属性 school_name

    s2 = Student('小强',20)
    print(s2.name,s2.age,s2.school_name)

 10.类方法和实例方法

class Student():
    # 类属性 == 学校名称
    school_name = '三味书屋'

    def __init__(self,name,age):
        # 实例属性
        self.name = name
        self.age = age

    #类方法
    @classmethod
    def print_school_name(cls):
        print(f'我的学校是:{cls.school_name}')

    #实例方法
    def study(self):
        print('我在三味书屋学编程')

if __name__ == '__main__':
    # 类名可以直接调用类方法
    Student.print_school_name()

    # 类名不可以直接调用实例方法
    #Student.study()# TypeError: study() missing 1 required positional argument: 'self'
    s = Student('tom',19)
    s.study()# 我在三味书屋学编程

    s.print_school_name() #我的学校是:三味书屋 -- 不推荐使用对象调用 类方法.

11.工具类的制作[扩展]

# 工具类: 为了方便调用者使用类中的属性或方法.
class My_Math():

    #类属性
    PI = 3.14

    #类方法 -- 求任意个整数的和
    @classmethod
    def sum(cls,*args):
        sum = 0
        for i in args:
            sum += i
        return sum

if __name__ == '__main__':
    print(My_Math.sum(1, 2, 3, 4, 5))
    print(My_Math.PI)

 12.静态方法

class MyTools:

    #定义静态方法
    @staticmethod
    def print_Tools_info():
        print("这是我写得工具类.工具类中只用类属性和类方法.方便你来使用.请用类名来用吧.")

if __name__ == '__main__':
    #静态方法可以使用类名调用
    MyTools.print_Tools_info()

    # 静态方法可以使用对象名调用
    mt = MyTools()
    mt.print_Tools_info()

    print(mt.print_Tools_info)

    mt2 = MyTools()
    mt2.print_Tools_info()

    print(mt2.print_Tools_info)

13.综合案例


1. 设计一个 Game 类 (类名)
2. 属性:
    • 定义一个 top_score 类属性 -> 记录游戏的历史最高分
    • 定义一个 player_name 实例属性 -> 记录当前游戏的玩家姓名
3. 方法:
    • 静态方法 show_help() -> 直接打印  这是游戏帮助信息
    • 类方法 show_top_score() -> 显示历史最高分
    • 实例方法 start_game() -> 开始当前玩家的游戏
        -   3.1 输出 玩家 xxx 开始游戏
        -   3.2 使用随机数,生成 10 - 100 之间的随机数字作为本次游戏的得分
        -   3.3 打印 玩家 xxx 本次游戏得分 xxx
        -   3.4 判断本次游戏得分和最高分之间的关系
4. 主程序步骤: __main__
    1 查看帮助信息
    2 查看历史最高分
    3 创建游戏对象,开始游戏

# 1. 设计一个 Game 类 (类名)
# 2. 属性:
#  • 定义一个 top_score 类属性 -> 记录游戏的历史最高分
#  • 定义一个 player_name 实例属性 -> 记录当前游戏的玩家姓名
# 3. 方法:
#  • 静态方法 show_help() -> 直接打印  这是游戏帮助信息
#  • 类方法 show_top_score() -> 显示历史最高分
#  • 实例方法 start_game() -> 开始当前玩家的游戏
#         -   3.1 输出 玩家 xxx 开始游戏
#         -   3.2 使用随机数,生成 10 - 100 之间的随机数字作为本次游戏的得分
#         -   3.3 打印 玩家 xxx 本次游戏得分 xxx
#         -   3.4 判断本次游戏得分和最高分之间的关系
# 4. 主程序步骤: __main__
#     1 查看帮助信息
#     2 查看历史最高分
#     3 创建游戏对象,开始游戏

import random


class Game:
    top_score = 0#记录游戏的历史最高分

    def __init__(self,name):
        self.player_name = name

    @staticmethod
    def show_help():
        print('这是游戏帮助信息')

    @classmethod
    def show_top_score(cls):
        print(f"历史最高分是:{cls.top_score}")

    def start_game(self):
        print(f"玩家{self.player_name}开始游戏")
        score = random.randint(10,100)
        print(f'玩家{self.player_name}本次得分:{score}')
        if score > Game.top_score:
            print(f'恭喜玩家{self.player_name}打破游戏最高分{Game.top_score}记录,得分{score}')
            Game.top_score = score

if __name__ == '__main__':
    Game.show_help()
    Game.show_top_score()
    zs = Game('张三')
    zs.start_game()

    ls = Game('李四')
    ls.start_game()

    ww = Game('王五')
    ww.start_game()

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

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

相关文章

聚焦珠宝产业数字化变革 世界珠宝数字化发展论坛在厦门举办

家庭周报厦门讯 5月18日&#xff0c;世界珠宝数字化发展论坛在厦门举办。本活动由北京北大宝石鉴定中心作为指导单位&#xff0c;中国广告主协会品牌建设与营销专业委员会、世界珠宝数字化发展论坛组委会主办&#xff0c;北京真心红珠宝有限公司承办。这是在数字中国建设整体布…

S20330-SRS步进电机最简单的驱动方法

​ S20330-SRS步进电机最简单的驱动方法 步进电机最简单的驱动方法&#xff0c;了解四轴步进电机驱动器原理 四轴步进电机驱动器原理-简介四轴步进电机驱动器&#xff0c;其实就是一种将电脉冲转化为角位移的执行机构。首先步进驱动器会接收到一个脉冲信号&#xff0c;然后它按…

小航编程题库2022年NOC决赛图形化(小高组)(含题库教师学生账号)

需要在线模拟训练的题库账号请点击 小航助学编程在线模拟试卷系统&#xff08;含题库答题软件账号&#xff09;_程序猿下山的博客-CSDN博客 单选题3.0分 删除编辑 答案:A 第1题运行下面的程序&#xff0c;最终“我的变量”的值是多少&#xff1f; A、5B、10C、25D、30 答案…

排序算法——冒泡排序详解及优化

冒泡排序 排序的稳定性冒泡排序优化后的冒泡排序冒泡排序的复杂度 排序的稳定性 对于一个排序算法&#xff0c;假设两个相同的元素Ai和Aj 在排序前这两个元素满足条件i<j&#xff0c;即Ai在Aj之前 在排序后Ai仍在Aj之前&#xff0c;则称为排序算法为稳定排序 否则称这个算法…

【Linux】多进程实现并发服务器

多进程实现并发服务器 1.此时来一个客户端请求时 创建cfd1 属于是阻塞状态 如果再有一个客户端就没办法提取了 2.所以要fork一个子进程&#xff0c;此时关闭父进程的cfd1&#xff0c;关闭子进程的lfd;不影响其它客户端请求连接 具体流程&#xff1a; 创建套接字 绑定 监听 …

DNDC模型二:减排潜力模拟

查看原文>>>生态系统模型&#xff1a;DNDC、CMIP6、GEE林业、无人机遥感、InVEST、Noah-MP、ArcGIS Pro、APSIM模型等 由于全球变暖、大气中温室气体浓度逐年增加等问题的出现&#xff0c;“双碳”行动特别是碳中和已经在世界范围形成广泛影响。国家领导人在多次重要…

ZooKeeper 用的好好地,Kafka 为什么要抛弃 ZooKeeper?

ZooKeeper 的作用 ZooKeeper 是一个开源的分布式协调服务框架&#xff0c;你也可以认为它是一个可以保证一致性的分布式(小量)存储系统。特别适合存储一些公共的配置信息、集群的一些元数据等等。 它有持久节点和临时节点&#xff0c;而临时节点这个玩意再配合 Watcher 机制就…

升级到PyTorch 2.0的技巧总结

PyTorch 2.0 发布也有一段时间了&#xff0c;大家是不是已经开始用了呢&#xff1f; PyTorch 2.0 通过引入 torch.compile&#xff0c;可以显着提高训练和推理速度。 与 eagerly 模式相反&#xff0c;编译 API 将模型转换为中间计算图&#xff08;FX graph&#xff09;&#xf…

App外包开发上线Google Play流程

完成App开发后需要在各大应用市场上线&#xff0c;国内的应用市场比较多&#xff0c;各自的规则也不相同&#xff0c;上线审核也比较复杂&#xff1b;国外上线主要是Google Play市场&#xff0c;它更重视隐私的保护&#xff0c;必须严格按照规范来保护个人隐私&#xff0c;因此…

chatgpt赋能Python-python_gantt

Python Gantt&#xff1a;更高效的项目管理工具 在当今快节奏的环境下&#xff0c;项目管理的重要性愈发凸显。Gantt图作为一种常见的项目计划图表工具&#xff0c;已经得到了广泛的应用。Python作为一种高效的编程语言&#xff0c;自然而然地成为了Gantt图的一种实现方式。 …

chatgpt赋能Python-python_header怎么写

Python是一种高级编程语言&#xff0c;已经被广泛地应用于人工智能、数据分析、网站开发等多个领域。在使用Python编写代码时&#xff0c;我们经常需要在编写代码之前添加一些注释&#xff0c;来对代码进行说明或者提醒。在Python中&#xff0c;我们可以通过编写Header&#xf…

泰克Tektronix MDO4054C混合域示波器

附加功能&#xff1a; 带宽&#xff1a;500 兆赫 带宽可升级至 1 GHz频道&#xff1a;4采样率&#xff1a;2.5 GS/s 所有通道上的 20 M 记录长度> 340,000 wfm/s 最大波形捕获率数字电压表/频率计数器&#xff08;产品注册免费&#xff09;性能 6 合 1 集成示波器&#xff…

chatgpt赋能Python-python_head

Python.head——一款优秀的SEO工具 在当今数字化时代&#xff0c;SEO&#xff08;搜索引擎优化&#xff09;对于企业的网络营销来说是非常关键的。而Python.head就是一款非常优秀的SEO工具&#xff0c;它可以让你更好地优化你的网站&#xff0c;提升搜索引擎排名。 什么是Pyt…

burpsuite导入网站的客户端证书

0x01 背景 个别网站需要导入客户端的XX.P12证书&#xff0c;如果没有导入直接访问网站&#xff0c;浏览器会提示&#xff1a;400 Bad Request , 出现&#xff1a;No required SSL certificate was sent等提示&#xff0c;如下图 此时需要在burpsuite中导入证书 0x02 网站客户…

增收不增利?Mobileye困局

作为全球头部ADAS芯片供应商&#xff0c;Mobileye的财务数据变化也在一定程度上反映市场的走向。 本周&#xff0c;该公司发布今年一季度财报&#xff0c;数据显示&#xff0c;季度营收同比增长16%&#xff0c;至4.58亿美元。其中&#xff0c;产品平均交付价格从去年同期的51.0…

chatgpt赋能Python-python_gephi

Python Gephi&#xff1a;探索新时代的可视化数据分析 随着数据量不断增加&#xff0c;我们需要更多的工具来帮助我们更好地理解和分析这些数据。其中&#xff0c;可视化数据分析是一种效果非常明显的方法。通过数据可视化&#xff0c;我们可以更直观、更生动地显示和分析数据…

申请域名型(DV)SSL证书流程

详细步骤如下&#xff1a; 1、选购SSL证书 选择TrustAsia品牌&#xff0c;域名型DV&#xff0c;结算开通。&#xff08;购买SSL证书实际价格请以购买页面显示为准。&#xff09; 2.管理中心提交证书审核资料 &#xff08;资料补全&#xff09; 请填写真实有效审核资料 接下来参…

《人工智能与数据科学竞赛白皮书 2022 》重磅发布

日前&#xff0c;由DataCastle数据城堡联合福建省数据治理与数据流通工程研究院、电子科技大学大数据研究中心、山东省数据要素创新创业共同体、深圳国家基因库、亚马逊云科技、移动云编写的《人工智能与数据科学竞赛白皮书2022》于5月19日正式发布。 《白皮书2022》基于2020-…

陪诊小程序源码|陪诊小程序搭建|陪诊小程序制作

随着人们对健康关注程度的提升&#xff0c;陪诊服务也逐渐成为了医疗服务中不可或缺的一部分。为了满足人们在陪诊方面的需求&#xff0c;陪诊小程序应运而生。下面&#xff0c;我们将为大家介绍陪诊小程序开发的功能优势。 功能优势一键预约陪诊服务节省时间&#xff0c;方便…

阿里云ECS上安装宝塔

yum install -y wget && wget -O install.sh https://download.bt.cn/install/install_6.0.sh && sh install.sh 28615082 安装完之后会跳出端口号&#xff0c;用户名&#xff0c;密码&#xff0c;复制面板地址打开就可以&#xff0c;记得在安全组中配置一下需…