Day 15 python学习笔记

news2024/12/23 16:24:39

__str__

用print打印对象时,会自动调用

class Test:
    def __init__(self,name):
        self.name = name
    # 用print打印对象时,会自动调用
    def __str__(self):
        return f"姓名name的值是{self.name}"


a = Test("zhangsan")  
print(a)


结果:
姓名name的值是zhangsan

#不用__str__时:
#打印<__main__.Test object at 0x000001E3058A5050>

封装

面向对象的三大特征:封装、继承、多态(有的人认为抽象也是)

在面向对象中,认为定义在类中的属性外界可以更改是不安全的,封装指一种安全机制,不让外界直接修改或操作属性,因此,将属性私有化(封装),不让外界访问,如果要访问提供公开的方法:(getter、setter)
思想:如何将现实世界的事物描述成程序中的类私有化成员(属性、方法) sys模块查看
在成员变量或者成员方法前面加 _ _ 即可,私有成员类对象无法访问,而类中的其他成员可以使用

封装的目的:

  1. 封装数据:保护隐私
  2. 封装方法:隔离复杂度(只保留部分接口对外使用)

封装的方式

私有属性和方法:
  • 私有成员变量:变量名以__开头(2个下划线)

  • 私有成员方法:方法名以__开头(2个下划线)

class Phone:
    __current_voltage = None # 当前电压 私有成员变量
 
 
    def call_by_5g(self):    
        print("5g通话已开启")
    def __keep_single_core(self):      # 私有成员方法
        print("让CPU以单核模式运行以节省电量") 

在Python中,可以使用_和__来定义属性的访问级别:

  • 以_开头的属性被视为受保护的属性,即它们不应该在类外部被直接访问。但是,它们可以在类的子类内部方法中被访问。
  • 以__开头的属性被视为私有属性,即它们不应该在类的外部被访问。但是,它们也可以在类的内部方法中被访问。

在类外部不能访问类内受保护的属性或方法(python规则)

例1:

class Phone:
 
    __current_voltage = None #当前电压
 
    def call_by_5g(self):
        print("5g通话已开启")
 
    def __keep_single_core(self):
        print("让cPU以单核模式运行以节省电量")
 
 
phone = Phone() # 创建对象
phone.__current_voltage=33 # 私有变量赋值 不报错,但无效
print(phone.__current_voltage)#获取私有变量值 报错,无法使用

对于私有属性,如果我们要在类外进行访问的话,会抛出 AttributeError 的错误

例2:

class Student:
    name=None
    age=None
    __userroot="123456"
    def __init__(self,name,age):
        self.name=name
        self.age=age
        # print(f"{self.name}{self.age}")
    def start(self):
        if self.__userroot=="123456":
            print("开始运行了")
    def get_password(self):  #方法:获取self.__userroot
       return self.__userroot
    def set_password(self,password):  ##方法:修改self.__userroot
        self.__userroot= password
name=Student("12",12)
name.start()
#print(name.__userroot) #私有成员外界访问不到
# python时动态语言,此时userroot私有相当于没有,会动态创建
name.userroot="123"



# 外界要访问私有化成员  get,set方法,在类中定义
name.set_password("222222")
print(name.get_password())

结果:
开始运行了
222222

python时动态语言,类中没有的属性,外边会动态创建,不会报错。

私有成员无法被类对象使用,但是可以被其它的成员使用

class Phone:
 
    __current_voltage = 0.5
 
 
    def __keep_single_core(self):
        print("让CPU以单核模式运行以节省电量")
 
    def call_by_5g(self):
        if self.__current_voltage >= 1:  #可以使用
           print("5g通话已开启")
 
        else:
           self.__keep_single_core()  #可以使用
           print("让CPU以单核模式运行以节省电量")

获取方法:

  1. 设置公开的方法:(getter、setter)方法
  2. 全局方法(property)
class Person:
    def __init__(self,name,age):
        self.__name = name
        self.__age = age

    def getter_name(self):
        return self.__name

    def setter_name(self,name):
        self.__name = name

    def getter_age(self):
        return self.__age

    def setter_age(self,age):
        self.__age = age

    def print_01(self):
        print(f"姓名是{self.__name},年龄是{self.__age}")
    age= property(getter_age,setter_age)  #全局方法,与def并列


p1 = Person("张三",21)
p1.age = 1000
print(p1.age)
p1.print_01()

结果:
1000
姓名是张三,年龄是1000

案例:

class Phone:
    # 设计私有成员变量
    __is_5g_enable = True   # 5G状态
 
    # 私有成员方法
    def __check_5G(self):
        if self.__is_5g_enable == True:
            print("5G开启")
        else:
            print("5G关闭,使用4G网络")
 
    # 提供公开成员方法
    def call_by_5G(self):
        self.__check_5G()
        print("正在通话中")
 
phone = Phone()
phone.call_by_5G()


结果:
5G开启
正在通话中

属性装饰器

属性装饰器是一种特殊的函数,它可以被用来修改属性的访问方式。在Python中,我们可以使用@property 和 @属性名.setter装饰器来定义属性的访问器和修改器

  • @property装饰器:用于定义属性的访问器,它会将属性定义为一个只读属性。当外部代码试图修改这个属性时,会触发一个AttributeError异常。
  • @属性名.setter装饰器:用于定义属性的修改器,它可以让外部代码修改这个属性的值。当外部代码试图读取这个属性时,会触发一个AttributeError异常。

案例

class MyClass:
    def __init__(self,value):
        self. __value = value
 
    @property           #读取
    def value(self):
        return self. __value
 
    @value.setter       #修改
    def value(self,new_value):
        self. __value = new_value
 
a = MyClass("哈哈哈哈")
print(a.value)
 
a.value = "啦啦啦啦"
print(a.value)

结果:
哈哈哈哈
啦啦啦啦

继承

面向对象的编程带来的主要好处之一是代码的重用,实现这种重用的方法之一是通过继承机制。

通过继承创建的新类称为子类或派生类,被继承的类称为基类、父类或超类

目的:大量减少代码冗余

__class__

实例出来的对象中存在一个属性__class__指向类

class Test:
    def print_01(self):
        pass


a = Test()
print(a.__class__)


结果:
<class '__main__.Test'>

继承的基本语法

class 派生类名(基类名)
    ...
例:
Object:是python中最顶层的类
class A(object):
    xxxx

class B(A):    #A为父类:基类    B为子类:派生类
    pass

单继承案例

class Parent:        # 定义父类
   parentAttr = 100
   def __init__(self):
      print("调用父类构造函数")
 
   def parentMethod(self):
      print('调用父类方法')
 
   def setAttr(self, attr):
      Parent.parentAttr = attr
 
   def getAttr(self):
      print("父类属性 :", Parent.parentAttr)
 
class Child(Parent): # 定义子类
   def __init__(self):
      print("调用子类构造方法")
 
   def childMethod(self):
      print('调用子类方法')
 
c = Child()          # 实例化子类
c.childMethod()      # 调用子类的方法
c.parentMethod()     # 调用父类方法
c.setAttr(200)       # 再次调用父类的方法 - 设置属性值
c.getAttr()          # 再次调用父类的方法 - 获取属性值


运行结果:
调用子类构造方法
调用子类方法
调用父类方法
父类属性 : 200

多继承


基本语法:
class 类名(父类1,父类2,……,父类N):

案例:
class Camera:
    def take_photo(self):
        print("我现在可以照相了")


class Mp4:
    def play_music(self):
        print("我现在能听歌了")


class Telephone(Camera,Mp4):
    def call(self):
        print("我能打电话")

    def answer(self):
        print("我能接电话")


tel = Telephone()
tel.play_music()   #调用父类的方法
tel.take_photo()

结果:
我现在能听歌了
我现在可以照相了

多继承注意事项
  • 多个父类中,如果有同名的成员,那么默认以继承顺序(从左到右)为优先级。
  • 即:先继承的保留,后继承的被覆盖

pass

pass是占位语句,用来保证函数(方法)或类定义的完整性,表示无内容,空的意思

复写:

觉得父类的方法不合适,在子类中定义一个与父类方法名相同的方法

复写案例
class Father:
    def play_game(self):
        print("超级玛丽")
        print("小霸王")

    def drink(self):
        print("喝水")

class Son(Father):
    def play_game(self):
        print("王者荣耀")
        print("吃鸡")

son = Son()
son.play_game()   #子类有则不去父类寻找
son.drink()


结果:
王者荣耀
吃鸡
喝水

调用父类同名成员

一旦复写父类成员,那么类对象调用成员的时候,就会调用复写后的新成员

如果需要使用被复写的父类的成员,需要特殊的调用方式:

方式1:
  • 调用父类成员      

    • 使用成员变量:父类名.成员变量      

    • 使用成员方法:父类名.成员方法(self)

方式2:
  • 使用super()调用父类成员      

    • 使用成员变量:super().成员变量      

    • 使用成员方法:super().成员方法()

实例1:
class Phone:
    IMEI = None # 序列号
    producer="ITCAST" # 厂商
    def call_by_5g(self):
        print("父类的5g通话")
 
 
class MyPhone(Phone):
    proucer = "ITHEIMA"
    
    def call_by_5g(self):
        # 方式1调用父类成员
        print(f"父类的品牌是:{Phone.producer}")
        Phone.call_by_5g(self)
 
        #方式2调用父类成员
        print(f"父类的品牌是:{super().producer}")
        super().call_by_5g()
        
        print("子类的5g通话")

c = MyPhone()
print(c.call_by_5g())

结果:
父类的品牌是:ITCAST   #方法1
父类的5g通话
父类的品牌是:ITCAST   #方法2
父类的5g通话
子类的5g通话
None

实例2:
class Father(object):
    def __init__(self,uname,age):
        self.uname = uname
        self.age = age


class Son(Father):
    def __init__(self,uname,age,collage):
        # self.uname = uname
        # self.age = age
        super().__init__(uname,age)
        self.collage = collage

    def __str__(self):
        return f"姓名是{self.uname},年龄是{self.age},大学是{self.collage}"


son = Son("王麻子",91,"家里蹲")
print(son)

结果:
姓名是王麻子,年龄是91,大学是家里蹲

多态


什么是多态

举一个现实中的例子,同样的一件事情,不同的人处理起来,他们的实现过程是完全不同的,会表现出不同的形态。比如:都是吃饭这个事情,中国人表现的是用筷子吃饭,而美国人表现的是用叉刀吃饭。这个就是相同的事情,表现出了不同的“形态”。

实例

定义了一个 animal 类,其中有一个方法 speak 表示动物发出声音

定义了两个子类——狗和猫,它们都继承了 animal 类并且复写了 speak 方法

  • 定义了一个函数,该函数需要接收一个类型为 animal 的对象
  • 调用 speak 方法,动物叫
  • 创建狗和猫这两个子类的对象
  • 调用函数时,传入狗和猫,然后输出“汪汪汪”和“喵喵喵”

这就是多态的体现,我们完成了某个具体的行为——即调用函数,但是我们传入了不同的对象,从而得到了不同的状态。比如,我们传入狗就会输出“汪汪汪”,传入猫就会输出“喵喵喵”

抽象类(接口)

  • 抽象类:含有抽象方法的类称之为抽象类
  • 抽象方法:方法体是空实现的(pass)称之为抽象方法

父类Animal的speak方法,是空实现

这种设计的含义是:

  • 父类用来确定有哪些方法
  • 具体的方法实现,由子类自行决定

抽象类就好比定义一个标准,包含了一些抽象的方法,要求子类必须实现

isinstance( )方法


描述

sinstance() 函数来判断一个对象是否是一个已知的类型,类似 type()。

isinstance() 与 type() 区别:

  • type() 不会认为子类是一种父类类型,不考虑继承关系。
  • isinstance() 会认为子类是一种父类类型,考虑继承关系。

4如果要判断两个类型是否相同推荐使用 isinstance()

语法 

isinstance(object, classinfo)
  • object -- 实例对象。
  • classinfo -- 可以是直接或间接类名、基本类型或者由它们组成的元组。

如果对象的类型与参数二的类型(classinfo)相同则返回 True,否则返回 False

案例

a = 10086
isinstance (a,int)  # true
 
isinstance (a,str) # false
 
isinstance (a,(str,int,list))# 只要满足元组类型中的其中一个即可,答案是满足,所以为true

class A:
    pass
 
class B(A):
    pass
 
print(isinstance(A(), A))  # True
print(type(A()) == A)  # True
print(isinstance(B(), A))  # True
print(type(B()) == A) # False

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

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

相关文章

40+专家齐聚共谋数据未来,StarRocks Summit 2023 议程公布!更多精彩议题等你探索...

数字经济时代&#xff0c;什么才是企业的核心竞争力&#xff1f; 答案是数据。 在过去的一年里&#xff0c;越来越多的企业率先行动起来&#xff0c;加入这场数智化的进程中&#xff0c;探寻最佳的底层数据架构模式和极致的数据分析方案。 作为数据进化的亲历者&#xff0c;Sta…

软考_软件设计师

算法&#xff1a; 1、直接插入排序 详解&#xff1a;https://blog.csdn.net/qq_44616044/article/details/115708056 void insertSort(int data[],int n){int i,j,temp;for(i1;i<n;i){if(data[i]<data[i-1]){temp data[i];data[i] data[i-1];for(ji-1;j>0&&am…

OPPO Find N3,解码“新商务场景”

2023行至尾声&#xff0c;这一年消费电子市场的整体表现&#xff0c;很难被评价为乐观。智能手机等大宗产品的需求疲软&#xff0c;技术越来越同质化&#xff0c;产品越来越成熟&#xff0c;出货量下行。国际数据公司&#xff08;IDC&#xff09;手机季度跟踪报告显示&#xff…

App测试基本流程以及注意事项

1 APP测试基本流程 1.1流程图 1.2测试周期 测试周期可按项目的开发周期来确定测试时间&#xff0c;一般测试时间为两三周&#xff08;即15个工作日&#xff09;&#xff0c;根据项目情况以及版本质量可适当缩短或延长测试时间。 1.3测试资源 测试任务开始前&#xff0c;检查…

弱覆盖栅格图层制作

栅格边界生成及图层制作 栅格边界polygon生成 提取的弱覆盖栅格数据中包含了栅格中心经度和栅格中心维度&#xff0c;我们根据栅格中心经纬度生成对应的栅格边界POLYGON&#xff08;20米*40米&#xff09; 计算公式&#xff1a;polygon(栅格中心经度-0.00017 栅格中心纬度0.00…

大数据之LibrA数据库系统告警处理(ALM-12004 OLdap资源异常)

告警解释 当Manager中的Ldap资源异常时&#xff0c;系统产生此告警。 当Manager中的Ldap资源恢复&#xff0c;且告警处理完成时&#xff0c;告警恢复。 告警属性 告警参数 对系统的影响 Ldap资源异常&#xff0c;Manager和组件WebUI认证服务不可用&#xff0c;无法对Web上层…

Syntax Error: TypeError: this.getOptions is not a function的解决(Vue)

报错信息&#xff1a; TypeError: this.getOptions is not a function 这个是在运行项目是遇到的问题 这个报错是类型错误&#xff0c;this.getOptions 不是一个函数 。这个错误一般就是less-loader库里的错误。 主要是less-loader版本太高&#xff0c;不兼容this.getOptions…

WPF自定义控件库之Window窗口

在WPF开发中&#xff0c;默认控件的样式常常无法满足实际的应用需求&#xff0c;我们通常都会采用引入第三方控件库的方式来美化UI&#xff0c;使得应用软件的设计风格更加统一。常用的WPF的UI控件库主要有以下几种&#xff0c;如&#xff1a;Modern UI for WPF&#xff0c;Mat…

IDEA配置类、方法注释模板

一、打开 IDEA 的 Settings&#xff0c;点击 Editor–>File and Code Templates&#xff0c;点击右边 File 选项卡下面的 Class&#xff0c;在其中添加图中红框内的内容&#xff1a; /** * author li-kun * date ${YEAR}年${MONTH}月${DAY}日 ${TIME} */当你创建一个新的类…

考试成绩这样分发

老师们&#xff0c;还在为每次繁琐的成绩查询而头痛&#xff1f;今天我就要给大家带来一个超级实用的教程&#xff0c;让你轻松解决这个问题&#xff01; 我来介绍一下这个神秘的“成绩查询页面”。别以为它很复杂&#xff0c;其实它就是一个简单的网页&#xff0c;上面会有每个…

深入探索 C++ 多态 ① - 虚函数调用链路

前言 最近翻阅侯捷先生的两本书&#xff1a;&#xff08;翻译&#xff09;《深度探索 C 对象模型》 和 《C 虚拟与多态》&#xff0c;获益良多。 要理解多态的工作原理&#xff0c;得理解这几个知识点的关系&#xff1a;虚函数、虚函数表、虚函数指针、以及对象的 内存布局。…

【骑行贝丘渔场】一场与海的邂逅,一段难忘的旅程

在这个渐凉的秋日&#xff0c;我们校长骑行队一行人骑着自行车&#xff0c;从大观公园门口出发&#xff0c;开始了一段别开生面的海滩之旅。沿途穿越草海隧道湿地公园、迎海路、海埂公园西门&#xff08;第二集合点&#xff09;、宝丰湿地公园、斗南湿地公园、蓝光城&#xff0…

代理模式代理模式

目录 1、使用场景 2、静态代理 3、动态代理 JDK动态代理 CGlib 动态代理实现 1、使用场景 使用代理模式主要有两个目的&#xff1a;一是保护目标对象&#xff0c;二是增强目标对象。 2、静态代理 NO.1 抽象接口&#xff1a;定义视频播放器接口Player public interface P…

大数据之路-日志采集

数据采集作为大数据体系中的第一环节&#xff0c;对如何全面、高性能、规范完成海量数据的采集&#xff0c;并将其传输到大数据平台。 1.浏览器的页面日志采集 1.1 页面浏览日志采集流程 页面浏览日志是最基础的互联网日志&#xff0c;其中页面浏览量&#xff08;PageView&am…

短期经济波动:均衡国民收入决定理论(一)

宏观经济学讲义 10 短期经济波动&#xff1a;均衡国民收入决定理论(一) 文章目录 10 短期经济波动&#xff1a;均衡国民收入决定理论(一)[toc]1 均衡国民收入决定1.1 均衡国民收入决定的不同理论1.2 两部门经济&#xff1a;有效需求原理和框架1.2.1 模型假设1.2.2 模型推导1.2…

【零基础抓包】Fiddler超详细教学(一)

​Fiddler 1、什么是 Fiddler? Fiddler 是一个 HTTP 协议调试代理工具&#xff0c;它能够记录并检查所有你的电脑和互联网之间的 HTTP 通讯。Fiddler 提供了电脑端、移动端的抓包、包括 http 协议和 https 协议都可以捕获到报文并进行分析&#xff1b;可以设置断点调试、截取…

期中成绩发布一对一查询

亲爱的老师们&#xff01;我知道您在期中考试后忙碌而又紧张&#xff0c;不仅要准备试卷分析&#xff0c;还要面对学生和家长的询问。现在&#xff0c;我为您带来了一款一对一成绩查询系统&#xff0c;让您的工作变得更简单、更高效&#xff01; 什么是成绩查询系统&#xff1f…

一个小妙招从Prompt菜鸟秒变专家!加州大学提出PromptAgent,帮你高效使用ChatGPT!

夕小瑶科技说 原创 作者 | 谢年年、王二狗 有了ChatGPT、GPT4之后&#xff0c;我们的工作学习效率得到大大提升&#xff08;特别在凑字数方面୧(๑•̀◡•́๑)૭&#xff09;。 作为一个工具&#xff0c;有人觉得好用&#xff0c;自然也有人觉得难用。 要把大模型用得6&am…

518抽奖软件,为什么说比别的抽奖软件更美观精美?

518抽奖软件简介 518抽奖软件&#xff0c;518我要发&#xff0c;超好用的年会抽奖软件&#xff0c;简约设计风格。 包含文字号码抽奖、照片抽奖两种模式&#xff0c;支持姓名抽奖、号码抽奖、数字抽奖、照片抽奖。(www.518cj.net) 精致美观功能 字体平滑无锯齿图片放大后清晰…

SCADA在污水和供水系统解决方案

1. 引言 随着城市化的不断发展&#xff0c;污水和供水系统的管理变得越来越重要。为了提高运营效率和监控系统状态&#xff0c;许多污水处理厂开始使用SCADA系统。 SCADA系统具有实时数据采集、监控和控制功能&#xff0c;可以帮助污水处理厂运营人员实时了解系统的运行情况&…