python 参数类型的多态_【Python】面向对象:类与对象\封装\继承\多态
六、Python面向对象--类与对象\封装\继承\多态
1、什么是面向对象编程
1.1 程序设计的范式:程序可控,易于理解
1.2 抽象并建立对象模型
1.3 程序是不同对象相互调用的逻辑。每个对象在代码中抽象出来其实就是类;描述类特征的成为属性;具体到某个类(独立的类)则成为实例
2、类与对象
2.1 类:是多个类似事物的统称。能够帮助我们快速理解和判断事物的性质
2.2 数据类型:不同的数据类型属于不同的类,使用内置函数type()可以查看数据类型
2.3 对象: (eg)100、40、999都是int类下包含的相似的不同个例,这个个例专业术语称为实例或对象,python中一切皆对象
2.4 类的创建
① 语法:通过class关键字定义一个类;类名以大写字母开头
② 类的组成:类属性、实例方法、静态方法、类方法
2.5 对象的创建
① 对象的创建又称为类的实例化
② 语法:实例名 = 类名()
③ 意义:有了实例,就可以调用类中的内容
2.6 类属性、类方法、静态方法
① 类属性:类中方法外的变量称为类属性,被该类的所有对象所共享
② 类方法:[email protected],使用类名直接访问的方法
③ 静态方法:[email protected],使用类名直接访问的方法
④ 一个例子
class Student: # Student 为类的名称(类名)由一个或多个单词组成,每个单词的首字母大写,其余小写
native_pace = ‘吉林‘ # 直接写在类里的变量,称为类属性
# 初始化方法
def __init__(self, name, age):
self.name = name # self.name 称为实例属性,进行了一个赋值操作,将局部变量的name的值赋给实例属性
self.age = age
# 实例方法
def eat(self): # 采用类名.方法名(类的对象)调用时,需要传入self
print(‘学生吃东西~~~~‘)
# 静态方法:[email protected]
@staticmethod
def method(): # 静态方法中不允许写self
print(‘这是静态方法‘)
# 类方法:[email protected]
@classmethod
def cm(cls): # 类方法中写cls,采用类名.方法名(类的对象)调用的时候不需要传入cls
print(‘这是类方法‘)
# 在类之内定义的称为方法,在类之外定义的称为函数
def drink(): # 定义在类之外,叫做函数
print(‘喝水‘)
print(Student) # ==>
print(type(Student)) # ==>
print(id(Student)) # ==>1669260589880
# 创建Student类的对象:根据类对象创建出来的对象,叫做实例对象
stu1 = Student(‘张三‘, 20)
print(stu1)
print(type(stu1))
print(id(stu1))
# 对象调用类方法一,可以直接采用 对象名.方法名()
stu1.eat() # ==>学生吃东西~~~~
print(stu1.name) # ==>张三
print(stu1.age) # ==>20
# 对象调用类方法二
Student.eat(stu1) # 类名.方法名(类的对象)-->实际上就是方法定义出的self
# 类属性的使用方式
print(Student.native_pace)
stu2 = Student(‘李四‘, 33)
print(stu1.native_pace)
print(stu2.native_pace)
Student.native_pace = ‘天津‘ # 修改类属性后,访问时所有值都改变
print(stu1.native_pace)
print(stu2.native_pace)
# 类方法的使用方式
Student.cm()
# 静态方法的使用方式
Student.method()
2.7 动态绑定属性和方法
① python是动态语言,在创建对象之后,可以动态地绑定属性和方法
② 一个例子
class Student:
def __init__(self, name, age):
self.name = name
self.age = age
def eat(self):
print(self.name + ‘在吃饭‘)
# 一个Student类可以创建多个Student的实例对象,每个实例对象可以相同也可以不同
stu1 = Student(‘张三‘, 20)
stu2 = Student(‘李四‘, 33)
# 为stu2动态绑定性别属性,但是stu1不存在性别属性
stu2.gender = ‘女‘
print(stu1.name, stu1.age)
print(stu2.name, stu2.age, stu2.gender)
# 为stu1单独绑定一个动态函数
def show():
print(‘定义在类之外的,称函数‘)
stu1.show = show # 动态绑定方法
stu1.show()
stu2.show() # stu2没有绑定这个方法,所以执行报错
3、面向对象三大特征
3.1 封装:提高程序的安全性
① 将数据(属性)和行为(方法)包装到类对象中,在方法内部对属性进行操作,在类对象的外部调用方法。这样,无需关心方法内部的具体实现细节,从而隔离了复杂度
② 在python中没有专门的修饰符用于属性的私有,如果该属性不希望在类对象外部被访问,前面使用两个‘_’.
③ 一个例子
class Student:
def __init__(self, name, age):
self.name = name
self.__age = age # 年龄不希望在类的外部被使用,所以加了两个__
def show(self):
print(self.name, self.__age)
stu = Student(‘张三‘, 20)
stu.show()
# 在类的外部使用name和age
print(stu.name)
print(stu.__age) # 出现报错,不能直接使用。AttributeError: ‘Student‘ object has no attribute ‘__age‘
print(dir(stu)) # 查看stu可以使用的全部属性和方法
print(stu._Student__age) # 在类的外部访问
3.2 继承:提高代码的复用性
① 语法
class 子类类名(父类1, 父类2, ...):
pass
② 如果一个类没有继承任何类,则默认继承object
③ python支持多继承
④ 定义子类时,必须在其构造函数中调用父类的构造函数:新类不需要重头编写,子类只需要实现缺少的新功能,继承父类所有的属性、功能
class Person(object): # Person 继承object类
def __init__(self, name, age):
self.name = name
self.age = age
def info(self):
print(self.name, self.age)
class Student(Person):
def __init__(self, name, age, stu_no):
super().__init__(name, age)
self.stu_no = stu_no
class Teacher(Person):
def __init__(self, name, age, teach_year):
super().__init__(name, age)
self.teach_year = teach_year
stu = Student(‘张三‘, 20, ‘1001‘)
tea = Teacher(‘老师‘, 33, 10)
stu.info()
tea.info()
⑤ 函数isinstance()可以判断一个变量的类型class Person(object)
class Person(object):
def __init__(self, name, gender):
self.name = name
self.gender = gender
class Student(Person):
def __init__(self, name, gender, score):
super(Student, self).__init__(name, gender)
self.score = score
class Teacher(Person):
def __init__(self, name, gender, course):
super(Teacher, self).__init__(name, gender)
self.course = course
p = Person(‘Tim‘, ‘Male‘)
s = Student(‘Bob‘, ‘Male‘, 88)
t = Teacher(‘Alice‘, ‘Female‘, ‘English‘)
# 在继承链上,一个父类的实例不能是子类类型,因为子类比父类多了一些属性和方法
print(isinstance(p, Person)) # ==>True # p是Person类型
isinstance(p, Student) # ==>False # p不是Student类型
isinstance(p, Teacher) # ==>False # p不是Teacher类型
# 在一条继承链上,一个实例可以看成它本身的类型,也可以看成它父类的类型
isinstance(s, Person) # ==>True # s是Person类型
isinstance(s, Student) # ==>True # s是Student类型
isinstance(s, Teacher) # ==>False # s不是Teacher类型
# isinstance也可以用于Python自有数据类型的判断
s = ‘this is a string.‘
n = 10
isinstance(s, int) # ==> False
isinstance(n, str) # ==> False
3.3 多态:提高程序的可扩展性和可维护性
① 多态就是“具有多种形态”,即使不知道一个变量所引用的对象到底时什么类型,仍然可以通过这个变量调用方法,在运行过程中根据变量所引用对象的类型,动态决定调用哪个对象中的方法
②
③
④
⑤
4、方法重写
4.1 如果子类对继承自父类的某个属性或者方法不满意,可以在子类中对其(方法体)进行重新编写
4.2 子类重写后的方法中可以通过super().xxx()调用父类中被重写的方法
4.3 一个例子
class Person(object): # Person 继承object类
def __init__(self, name, age):
self.name = name
self.age = age
def info(self):
print(self.name, self.age)
class Student(Person):
def __init__(self, name, age, stu_no):
super().__init__(name, age)
self.stu_no = stu_no
# 重写父类中的info方法
def info(self):
super().info() # 会先执行父类中的info方法
print(self.stu_no)
class Teacher(Person):
def __init__(self, name, age, teach_year):
super().__init__(name, age)
self.teach_year = teach_year
# 重写父类中的info方法
def info(self):
super().info() # 会先执行父类中的info方法
print(self.teach_year)
stu = Student(‘张三‘, 20, ‘1001‘)
tea = Teacher(‘老师‘, 33, 10)
stu.info()
tea.info()
5、object类
5.1 object类时所有类的父类,因此所有类都有object的属性和方法
5.2 内置函数dir()可以查看那指定对象的所有属性
5.3 object类有一个__str__()方法,用于返回一个对于“对象的描述”,对应于内置函数str()经常用于print()方法,帮助我们查看对象的信息,所以我们经常会对__str__()重写
class Student():
def __init__(self, name, age, stu_no):
self.name = name
self.age = age
self.stu_no = stu_no
def __str__(self):
return ‘我的名字是{}. 年龄是{}‘.format(self.name, self.age)
stu = Student(‘张三‘, 20, ‘1001‘)
print(stu) # 默认会调用__str__()方法
print(type(stu))
原文:https://www.cnblogs.com/xuanling/p/14422786.html
python 参数类型的多态_【Python】面向对象:类与对象\封装\继承\多态相关推荐
- python多态的三种表现形式_python小结----面向对象的三大特征(封装,继承,多态)
面向对象的三大特征: 封装,继承,多态 面向对象的编程思想核心:高类聚,低耦合–程序的设计模式范畴 封装 什么是封装: 在面向对象编程的思想中,对代码进行高度封装,封装又叫包装 封装就是指将数据或者函 ...
- Day55-每日一道Java面试题-Java 面向对象编程三大特性: 封装 继承 多态
Java 面向对象编程三大特性: 封装 继承 多态 封装 封装把一个对象的属性私有化,同时提供一些可以被外界访问的属性的方法,如果属性不想被外界访问,我们大可不必提供方法给外界访问.但是如果一个类没有 ...
- 面向对象 编程及面向对象三大属性:封装 继承 多态
面向对象 面向对象(Object Oriented,OO)是软件开发方法.面向对象的概念和应用已超越了程序设计和软件开发,扩展到如数据库系统.交互式界面.应用结构.应用平台.分布式系统.网络管理结构. ...
- Python学习笔记④——类、面向对象的三大特征 [封装+继承+多态]
✅ Blogger Learns Python is for learning the "Deep Learning". 文章目录 一.面向对象编程的简介 二.类与对象 -- 基础 ...
- python类与对象 封装继承与多态 0308
类与对象 初始化方法 init方法 带参实例化类 del方法 str方法 私有 继承 方法的重写 super 父类名称调父类方法 调用父类私有 间接调用 多继承 新式类经曲类 多态 类属性 类方法 静 ...
- java自学 part2 数组 类和对象 包 继承 多态 抽象类 接口
数组:arr 获取数组的长度:arr.length 数组转字符串: Arrays.toString(arr) 数组的拷贝: Arrays.copyOf(arr,arr.length) 数组的排序:Ar ...
- 面向对象的个人理解(封装/继承/多态实践)
目录 前言 为什么要封装? 为什么要继承? 什么是多态? 前言 计算机科学是一门实践性很强的科目,所有理论都不是凭空而来的,某种理论的出现都是为了解决过往的不足.面向对象是其中之一,但我们不能单从字面 ...
- 面向对象的四大特征 封装 继承 多态 抽象
1.封装 广义: 类 方法 包 的定义本身就是一种封装 狭义: 在设计一个类的时候 将所有的属性设置为私有的 并对各个私有的属性设计相应的 存/取方法 来完成对属性的使用 私有化只能代表封装的特性 可 ...
- OC面向对象的三大特征(封装 继承 多态)习题2 复合
复合:一个类中有一个成员变量是另外一个类的对象. 比如我现在要制作一台电脑,电脑需要CPU,显示器,鼠标和键盘等.这些东西的研发都是很复杂的过程.如果现在有成型的CPU等组件,就可以直接用这些组件攒一 ...
最新文章
- R语言时间序列(time series)分析实战:使用ARIMA模型预测时间序列
- 问题解决笔记,Restarting network (via systemctl):: Job for network.service failed. ...
- eclipse调出server_eclipse在server中tomcat server找不到的问题
- 存储过程,游标和触发器实例
- linux mxnet 查询_mxnet c_predict_api的Go绑定实现 – go-mxnet-predi...
- B00002 C语言位字段实例
- C语言 — 转义字符
- @cacheable 设置过期时间_Redis 的过期策略是如何实现的?
- js:防抖动与节流【转载】
- 第一章 基于STM32核心板的电路设计与制作流程
- EPlan 下载和破解
- 使用GreenSock插件轻松制作精美的Web动画
- laravel学习笔记
- VL817-Q7 USB3.0HUB
- word2016 尾注后加致谢
- 源代码转换成图-控制流图、数据流图
- 十五章、KPI(千峰网络安全300课时笔记)
- 三值的排序 Sorting a Three-Valued Sequence(洛谷 P1459)
- Android 之网络
- c++基于ffmpeg实现mp4转flv
热门文章
- currentThread()方法的作用
- 2.2 进阶-禁忌雷炎
- 4.3.6 无分类编址CIDR(构成超网)
- jQuery的get()和post()方法
- java transaction cn,JAVA中如何用TRANSACTION来对数据库进行
- channelread0会被调用两次_值得一看:C#同步方法中如何调用异步方法?
- 突发,Log4j2 爆出远程代码执行漏洞,各大厂纷纷中招!
- 不止一个人犯错,这种 Github 不要写在简历上!
- Java 8 中的流操作-基本使用性能测试
- java基础提升篇:深入分析Java的序列化与反序列化