【Python基础知识-pycharm版】第九节_面向对象的三大特征

第九节

  • 方法
    • 方法没有重载
    • 私有属性和私有方法(实现封装)
    • @property装饰器_get和set方法
  • 面向对象的三大特征说明(封装、继承、多态)
    • 继承
      • 方法的重写(类成员的继承和重写)
      • 查看类的继承结构
      • object根类_dir() 查看对象属性
      • 重写__str__()方法
      • 多重继承
      • mro()
      • super()获得父类的定义
    • 多态
    • 特殊方法和运算符重载
    • 特殊属性
    • 对象的浅拷贝和深拷贝
    • 组合
  • 设计模式_工厂模式
  • 设计模式_单例模式

方法

方法没有重载

在这里插入图片描述

私有属性和私有方法(实现封装)

在这里插入图片描述

#测试私有属性
class Employee:def __init__(self,name,age):self.name=nameself.__age=agee=Employee('高琪',18)print(e.name)
#print(e.age)
print(e._Employee__age)
print(dir(e))

输出:

高琪
18
['_Employee__age', '__class__', '__delattr__', '__dict__', '__dir__', '__doc__', '__eq__', '__format__', '__ge__', '__getattribute__', '__gt__', '__hash__', '__init__', '__init_subclass__', '__le__', '__lt__', '__module__', '__ne__', '__new__', '__reduce__', '__reduce_ex__', '__repr__', '__setattr__', '__sizeof__', '__str__', '__subclasshook__', '__weakref__', 'name']Process finished with exit code 0
#测试私有属性
class Employee:__company='程序员'def __init__(self,name,age):self.name=nameself.__age=age    #私有属性def __work(self):   #私有方法print('好好工作!')print('年龄:{0}'.format(self.__age))e=Employee('高琪',18)print(e.name)
print(e._Employee__age)
print(dir(e))
e._Employee__work()
print(Employee._Employee__company)

输出:

高琪
18
['_Employee__age', '_Employee__company', '_Employee__work', '__class__', '__delattr__', '__dict__', '__dir__', '__doc__', '__eq__', '__format__', '__ge__', '__getattribute__', '__gt__', '__hash__', '__init__', '__init_subclass__', '__le__', '__lt__', '__module__', '__ne__', '__new__', '__reduce__', '__reduce_ex__', '__repr__', '__setattr__', '__sizeof__', '__str__', '__subclasshook__', '__weakref__', 'name']
好好工作!
年龄:18
程序员

@property装饰器_get和set方法

在这里插入图片描述
普通调用:

class Employee:def salary(self):print('salary run ...')return 10000
emp1=Employee()
emp1.salary()

结果:

salary run ...Process finished with exit code 0

采用@property

class Employee:@propertydef salary(self):print('salary run ...')return 10000
emp1=Employee()
#emp1.salary()
print(emp1.salary)

结果:

salary run ...
10000Process finished with exit code 0

相当于变成属性的调用
但是当赋值时出现报错

class Employee:@propertydef salary(self):print('salary run ...')return 10000
emp1=Employee()
#emp1.salary()
print(emp1.salary)
emp1.salary=30000
salary run ...
10000
Traceback (most recent call last):File "D:/PycharmProjects/MyTest/Day_0722/mytest05.py", line 18, in <module>emp1.salary=30000
AttributeError: can't set attributeProcess finished with exit code 1

简单测试@property

class Employee:def __init__(self,name,salary):self.name = nameself.salary = salaryemp1=Employee('高琪',30000)
print(emp1.salary)
emp1.salary=20000
print(emp1.salary)
30000
20000

这个时候没问题 简单的读取,但是封装化要求用户在使用的时候要完善,不能当输入-2000时仍然输出-2000,需要有提示的细节
首先是不使用@的

#简单测试@property
class Employee:def __init__(self,name,salary):self.__name = nameself.__salary = salarydef get_salary(self):return self.__salarydef set_salary(self,salary):if 1000<salary<50000:self.__salary=salaryelse:print('录入错误!薪水在1000-50000这个范围')
emp1=Employee('高琪',30000)
print(emp1.get_salary())
emp1.set_salary(-20000)
print(emp1.get_salary())
30000
录入错误!薪水在1000-50000这个范围
30000
Process finished with exit code 0
#简单测试@property
class Employee:def __init__(self,name,salary):self.__name = nameself.__salary = salarydef get_salary(self):return self.__salarydef set_salary(self,salary):if 1000<salary<50000:self.__salary=salaryelse:print('录入错误!薪水在1000-50000这个范围')
emp1=Employee('高琪',30000)
print(emp1.get_salary())
emp1.set_salary(20000)
print(emp1.get_salary())
30000
20000

加入@property

#简单测试@property
class Employee:def __init__(self,name,salary):self.__name = nameself.__salary = salary@propertydef salary(self):return self.__salary@salary.setterdef salary(self,salary):if 1000<salary<50000:self.__salary=salaryelse:print('录入错误!薪水在1000-50000这个范围')
emp1=Employee('高琪',30000)
print(emp1.salary)
emp1.salary=-20000
print(emp1.salary)
30000
录入错误!薪水在1000-50000这个范围
30000

面向对象的三大特征说明(封装、继承、多态)

在这里插入图片描述

继承

在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

class Person:def __init__(self,name,age):self.name=nameself.age=agedef say_age(self):print('不知道')
class Student(Person):def __init__(self,name,age,score):Person.__init__(self,name,age)self.score=score
print(Student.mro())
s=Student('高琪',18,60)
s.say_age()
print(s.name)
[<class '__main__.Student'>, <class '__main__.Person'>, <class 'object'>]
不知道
高琪
#测试继承的基本使用
class Person:def __init__(self,name,age):self.name=nameself.__age=age #私有属性def say_age(self):print('不知道')
class Student(Person):def __init__(self,name,age,score):Person.__init__(self,name,age) #必须显式的调用父类初始化方法,不然解释器不会去调用self.score=score
print(Student.mro())
s=Student('高琪',18,60)
s.say_age()
print(s.name)
print(dir(s))
print(s._Person__age)
[<class '__main__.Student'>, <class '__main__.Person'>, <class 'object'>]
不知道
高琪
['_Person__age', '__class__', '__delattr__', '__dict__', '__dir__', '__doc__', '__eq__', '__format__', '__ge__', '__getattribute__', '__gt__', '__hash__', '__init__', '__init_subclass__', '__le__', '__lt__', '__module__', '__ne__', '__new__', '__reduce__', '__reduce_ex__', '__repr__', '__setattr__', '__sizeof__', '__str__', '__subclasshook__', '__weakref__', 'name', 'say_age', 'score']
18

方法的重写(类成员的继承和重写)

在这里插入图片描述

class Person:def __init__(self,name,age):self.name=nameself.__age=agedef say_age(self):print('我的年龄是:',self.__age)def say_introduce(self):print('我的名字是{0}'.format(self.name))class Student(Person):def __init__(self, name, age, score):Person.__init__(self, name, age)  # 必须显式的调用父类初始化方法,不然解释器不会去调用self.score = scoredef say_introduce(self):'''重写了父类的方法'''print('报告老师,我的名字是{0}'.format(self.name))s=Student('高琪',18,60)
s.say_age()
s.say_introduce()
我的年龄是: 18
报告老师,我的名字是高琪Process finished with exit code 0

重写是对父类的方法进行修改

查看类的继承结构

在这里插入图片描述

在这里插入图片描述

object根类_dir() 查看对象属性

在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

重写__str__()方法

在这里插入图片描述

#测试重写object的__str__()
class Person:def __init__(self,name):self.name=namedef __str__(self):return '名字是:{0}'.format(self.name)p=Person('高琪')
print(p)
名字是:高琪Process finished with exit code 0

多重继承

在这里插入图片描述

mro()

在这里插入图片描述
在这里插入图片描述

#多重继承
class A:def aa(self):print('aa')def say(self):print('say AA')class B:def bb(self):print('bb')def say(self):print('say BB')class C(B,A):def cc(self):print('cc')c=C()
print(C.mro()) #打印类的层次结构
c.say()  #解释器寻找的方法是从左到右的方式寻找,此时会执行B类中的say()
[<class '__main__.C'>, <class '__main__.B'>, <class '__main__.A'>, <class 'object'>]
say BBProcess finished with exit code 0

super()获得父类的定义

在这里插入图片描述

在这里插入图片描述
在这里插入图片描述

多态

在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

特殊方法和运算符重载

在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

#测试运算符的重载
class Person:def __init__(self,name):self.name=namedef __add__(self,other):if isinstance(self,Person):return'{0}--{1}'.format(self.name,other.name)else:return'不是同类对象,不能相加'def __mul__(self,other):if isinstance(other,int):return self.name*otherelse:return'不是同类对象,不能相加'p1=Person('高琪')
p2=Person('高嘻嘻')
x = p1+p2
print(x)
print(p1*3)
高琪--高嘻嘻
高琪高琪高琪Process finished with exit code 0

特殊属性

在这里插入图片描述

在这里插入图片描述

对象的浅拷贝和深拷贝

在这里插入图片描述

在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

组合

在这里插入图片描述
在这里插入图片描述

在这里插入图片描述
在这里插入图片描述

设计模式_工厂模式

在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

设计模式_单例模式

在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

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

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

相关文章

LeetCode 1869. 哪种连续子字符串更长

文章目录1. 题目2. 解题1. 题目 给你一个二进制字符串 s 。如果字符串中由 1 组成的 最长 连续子字符串 严格长于 由 0 组成的 最长 连续子字符串&#xff0c;返回 true &#xff1b;否则&#xff0c;返回 false 。 例如&#xff0c;s "110100010" 中&#xff0c;…

如何通过像素点找到世界坐标_如何通过阅读来找到自己理论研究的“视域”?...

理论研究多用演绎法&#xff0c;也就是说&#xff0c;理论研究一般始于一个独特的概念、理论视角&#xff0c;或者判断。用刘良华的观点来说&#xff0c;这些都是理论研究的“视域”&#xff0c;也是理论研究得以展开的“大前提”。因此&#xff0c;理论研究最为关键的问题&…

任务并行VS数据并行

并行计算中&#xff0c;有两种并行的方法&#xff1a;任务并行&#xff08;task-parallelism&#xff09;和数据并行&#xff08;data-parallelism&#xff09;。任务并行&#xff1a;将许多可以解决问题的任务分割&#xff0c;然后分布在一个或者多个核上进行程序的执行。数据…

【Python基础知识-pycharm版】第十节_异常

第十节异常异常机制本质异常解决的关键&#xff1a;定位try... 一个 except 结构try... 多个 except 结构try...except...else 结 构try...except...finally 结构return 语句和异常处理问题常见异常的解决常见异常汇总with 上下文管理trackback 模块自定义异常类异常 在实际工…

k8s挂载目录_拥抱云原生,如何将开源项目用k8s部署?

k8s以及云原生相关概念近年来一直比较火热&#xff0c;阿丸最近搞了个相关项目&#xff0c;小结一下。本文将重点分享阿里开源项目otter适配k8s部署的改造过程&#xff0c;其中的改造过程和技巧应该适用于将大多数开源项目改造到k8s进行部署。1.背景otter是阿里开源的分布式数据…

LeetCode 1870. 准时到达的列车最小时速(二分查找)

文章目录1. 题目2. 解题2.1 模拟超时2.2 二分查找1. 题目 给你一个浮点数 hour &#xff0c;表示你到达办公室可用的总通勤时间。 要到达办公室&#xff0c;你必须按给定次序乘坐 n 趟列车。 另给你一个长度为 n 的整数数组 dist &#xff0c;其中 dist[i] 表示第 i 趟列车的行…

【Python基础知识-pycharm版】第十一节-文件操作(IO技术)

第十一节-文件操作&#xff08;IO技术&#xff09;文本文件和二进制文件文件操作相关模块概述创建文件对象 open()文本文件的写入基本的文件写入操作常用编码介绍ASCIIISO8859-1GB2312,GBK,GB18030中文乱码问题write()/writelines()写入数据close()关闭文件流with 语句(上下文管…

LeetCode 1871. 跳跃游戏 VII(贪心)

文章目录1. 题目2. 解题1. 题目 给你一个下标从 0 开始的二进制字符串 s 和两个整数 minJump 和 maxJump 。 一开始&#xff0c;你在下标 0 处&#xff0c;且该位置的值一定为 0 。 当同时满足如下条件时&#xff0c;你可以从下标 i 移动到下标 j 处&#xff1a; i minJump …

pcb外观维修_「维修案例」泰克AFG3021函数任意波形发生器故障维修

在产品调试的过程中&#xff0c;大多数的电路需要输入某种幅度随时间变化的信号&#xff0c;在这样的应用场景中&#xff0c;一个完整的测试测量系统一般会包含激励源&#xff0c;被测件和采集仪器三个部分。采集仪器通常使用的是示波器和逻辑分析仪&#xff0c;而信号源在系统…

设计模式--迭代器模式

实验18&#xff1a;迭代器模式 本次实验属于模仿型实验&#xff0c;通过本次实验学生将掌握以下内容&#xff1a; 1、理解迭代器模式的动机&#xff0c;掌握该模式的结构&#xff1b; 2、能够利用迭代器模式解决实际问题。 [实验任务]&#xff1a;JAVA和C常见数据结构迭代…

4k视频分辨率的码流_8K电视来了!但是8K视频仍很遥远

本届CES上&#xff0c;8K电视的集体发布可谓一大亮点&#xff0c;索尼、LG、TCL、三星等厂商纷纷推出8K电视。不光如此&#xff0c;本届CES上夏普突如其来的展示了一款具备8K视频拍摄功能的M43相机&#xff0c;这一点着实是出乎意料。今天我们就来讨论一下&#xff0c;在8K电视…

LeetCode 1707. 与数组中元素的最大异或值(Trie树)

文章目录1. 题目2. 解题1. 题目 给你一个由非负整数组成的数组 nums 。另有一个查询数组 queries &#xff0c;其中 queries[i] [xi, mi] 。 第 i 个查询的答案是 xi 和任何 nums 数组中不超过 mi 的元素按位异或&#xff08;XOR&#xff09;得到的最大值。 换句话说&#x…

我的爬虫第一天

爬虫一个简单的爬虫&#xff1a;1.安装request2.测试是否安装成功3.新建项目4.使用requests请求网页4.如何用python解析网页源码5.简单的保存数据的方法一个简单的爬虫&#xff1a; 1.安装request pip install requests2.测试是否安装成功 输入python import requests不报…

qr分解求线性方程组_计算方法/数值分析第三章 线性方程组的数值解法

主要内容&#xff1a;1、引言2、高斯消去法3、直接分解法4、解线性方程组的迭代法5、向量范数、矩阵范数及迭代法的收敛性第一节 引言用克拉姆求解线性方程组第二节 高斯消去法高斯消去法是一种古老的直接法&#xff0c;其基本思想是通过消元将线性方程组的求解问题转化成三角形…

python 执行完成后,cmd窗口自动关闭

一般脚本运行完需要点击一下 在代码最后添加以下内容即可自动关闭cmd&#xff1a; import os import time time.sleep(1) # 方便展示&#xff0c;可删除 os.system("taskkill /f /im cmd.exe") # 关闭cmd窗口

txt文件可存储最大值_Verilog边码边学:十六进制文件读取$readmemh

系统任务$readmemh读取十六进制文件。$readmemh的作用是将文件中的数据一次性的读入某个数组中&#xff0c;然后可以依次从数组中取出单个的数据进行处理。读取的内容只包括空白位置(空格、换行、制表格)、注释行、十六进制的数字。语法结构中的起始地址与终止地址可省略。【语…

什么叫诚实_他爱不爱你,身体最诚实

文字&#xff1a;嘉一 声音&#xff1a;三三有位听友给我发私信说&#xff1a;“他看我的眼神变了&#xff0c;也不喜欢和我说话了&#xff0c;更懒得为我做任何事了&#xff0c;这段感情真的没意思了。”我回她&#xff1a;“一个人爱不爱你&#xff0c;身体最诚实。嘴巴可以…

【机器学习-数据科学】第一节:numpypandas

numpy&pandas安装numpy&pandasarray创建numpy的基础运算numpy的索引numpy的 array 合并numpy的 array分割numpy的 copy & deep copy安装numpy&pandas import numpy as np arraynp.array([[1,2,3],[2,3,4]])# 将数组转化为矩阵 print(array) #打印矩阵 print(nu…

【机器学习-数据科学】第二节:ipython开发环境搭建以及pandas快速入门

ipython开发环境搭建以及pandas快速入门0.开发环境搭建技巧网页版ipython&#xff1a;ipython notebooknumpy1.pandas 快速入门一导入创建对象2. pandas 快速入门二空数据处理apply的用法count和mode函数数据合并3. pandas 快速入门三数据整形数据透视时间序列数据可视化数据载…

pytorch图像和张量的相互转换_Day107:Pytorch张量类型的构建与相互转换

张量的作用Pytorch的数据类型为各式各样的Tensor&#xff0c;Tensor可以理解为高维矩阵(与Numpy中的Array类似)通过使用Type函数可以查看变量类型。一CPU张量类型Pytorch中的tensor包括七种CPU张量类型和八种GPU张量类型&#xff0c;这里我们就只讲解一下CPU中的&#xff0c;GP…