目录

一,封装

1,类和对象

①创建类,语法

②实例化对象

③调用类属性和方法语法

2,self

3,属性

①类属性

②添加对象属性

③获取对象属性

④私有属性和私有方法

a,设置私有属性和方法

b,获取和修改私有属性的值

4,方法

①类方法

②静态方法

5,魔法方法

①__XX__()函数叫做魔法方法,指的是具有特殊功能的函数

②__init__()

③__str__() --------- 类似Java语言中的toString()方法

二,继承

1,单继承

2,多继承

3,查看一个类的继承关系

4,子类重写父类的同名属性和方法

5,子类调用父类的同名属性和方法

三,多态

1,概念

2,步骤

四,完整代码如下


一,封装

1,类和对象

Java和python都是面向对象的语言

①创建类,语法

class  类名:
         代码

#Java   class Person{    }#python  首字母需要大写
class Student:pass

②实例化对象

对象名 = 类名( )

# 实例化
#java  new Student()
# python
s=Student()
#打印s 肯定是内存地址
print(s)

控制台输出<__main__.Student object at 0x000001C64DC733D0>

③调用类属性和方法语法

对象名.属性;
对象名.方法()

class Student:def say(self):# self这个参数是当前这个对象,不需要自己传参# 可以通过self去取得自身携带的一些东西,如属性print("hello",self)# 实例化
s=Student()
print(s)
s.say()

控制台输出,self和对象 内存地址一致

<__main__.Student object at 0x0000029B91939370>
hello <__main__.Student object at 0x0000029B91939370>

一个函数定义在类里面叫方法

2,self

self指的是调用该函数的对象

函数中默认参数self,该默认的参数self指的是调用该函数的对象

案例1:self和对象的内存地址是否一致?

class Student:def say(self):# self这个参数是当前这个对象,不需要自己传参# 可以通过self去取得自身携带的一些东西,如属性print("hello",self)# 实例化
s=Student()
print(s)
s.say()

控制台输出,self和对象 内存地址一致

<__main__.Student object at 0x0000029B91939370>
hello <__main__.Student object at 0x0000029B91939370>

案例2:如果是多个对象,调用同一个函数,self地址是否一致?

3,属性

①类属性

a,可以通过类名或者对象访问,写在类里面

语法: 变量名 = 变量值

class Student:name='小宝'sex:strage=20def say(self):# self这个参数是当前这个对象,不需要自己传参# 可以通过self去取得自身携带的一些东西,如属性print("hello",self)

b,修改类属性

类属性的修改,只能通过类修改,不能通过对象修改

语法:类名.变量名=变量值

# name 实例属性
s.name="张三"#添加了一个实例属性name  值是张三
Student.name="haha"#修改了类属性
# s有几个name属性? 【name类属性】【name实例属性】
del s.name #删除了name实例属性
# s.birth='2021-1-1'#不会报错,python是弱类型,对变量没有类型限制,对对象没有属性限制

注意:如果通过对象对属性进行重新赋值,实际上是给该对象又重新定义了一个属性名一样的变量

②添加对象属性

a,类外面添加对象属性

语法:  对象名.属性名 = 值        (注意:该种方式添加的属性,只能属于该对象的)

s.name="小张"

b,类里面添加对象属性

语法: 变量名 = 变量值        (注意:该种方式添加的属性,属于所有类对象的)

name='小宝'

c,__init__()方法中添加对象属性

语法:self.属性名 = 值        (用在__init__()初始化方法中)

def __init__(self,name:str="",age:int=0):#这里的str与int只是需要的类型,给其他类型也不会报错self.__name=nameself.__age=age

③获取对象属性

a,类外面获取对象属性,语法:对象名.属性名

print(s.name)

b,类里面获取对象属性,语法:self.属性名        (用在函数中)

def __str__(self):
        return f"名字{self.__name},年龄{self.__age}"

④私有属性和私有方法

a,设置私有属性和方法

在属性名和方法名前面加两个下划线__

定义为私有属性和私有方法,不能被子类继承

# 1.私有化属性
__name:str
__age:int

b,获取和修改私有属性的值

获取,定义getXXX()

修改,定义setXX()

#2,提供get/set
def get_name(self):return self.__name
def set_name(self,name:str):return self.__name

4,方法

①类方法

用装饰器@classmethod标识

@classmethod
def test(cls):cls.__name='xxx'

②静态方法

用装饰器@staticmethod标识

@staticmethod
def say():print("hello")

5,魔法方法

①__XX__()函数叫做魔法方法,指的是具有特殊功能的函数

def __str__(self):return f"名字{self.__name},年龄{self.__age}"

②__init__()

a,__init__():初始化对象

在创建一个对象时默认被调用,不需要手动调用

# 构造函数

def __int__(self):

pass

b,带参数的__init__()方法

# 构造函数
def __init__(self,name:str="",age:int=0):#这里的str与int只是需要的类型,给其他类型也不会报错self.__name=nameself.__age=age

③__str__() --------- 类似Java语言中的toString()方法

a,print输出对象时,默认打印的是对象在内存中的地址

b,如果类中定义__str__方法,则会打印__str__方法中的内容

class Student:# 1.私有化属性__name:str__age:intdef __str__(self):return f"名字{self.__name},年龄{self.__age}"

二,继承

1,单继承

父类,class 父类(object):

class Parent(object):name='张三 'def cook(self):print("正在煮饭[辣椒炒肉]")

子类,class 子类(父类):

class Mother(object):def cook(self):print("正在煮饭[红烧肉]")

2,多继承

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

class Parent(object):name='张三 'def cook(self):print("正在煮饭[辣椒炒肉]")class Mother(object):def cook(self):print("正在煮饭[红烧肉]")class Son(Mother,Parent):def cook_test(self):super(Son,self).cook()print("正在煮饭[茄子豆角]")

注意,如果一个类继承多个父类,优先继承父类1的同名属性和方法

3,查看一个类的继承关系

类.__mro__

①    print(Parent.mro())
②    print(Son.__mro__)

4,子类重写父类的同名属性和方法

class Cs():def cook(self):passclass Parent(Cs):def cook(self):print("正在煮饭[辣椒炒肉]")class Mother(Cs):def cook(self):print("正在煮饭[红烧肉]")

Parent,Mother重写了Cs的重名属性和方法

注意,如果子类重写了父类的同名属性和方法,则会调用子类中的同名属性和方法

5,子类调用父类的同名属性和方法

在子类的同名方法中调用,语法:父类类名.方法(self)

super(),调用父类方法,super().方法()

(适用于 单继承)

三,多态

1,概念

多态是一种使用对象的方式,子类重写父类方法,调用不同子类对象的相同父类方法,可以产生不同的执行效果

2,步骤

a,定义父类,提供父类方法

b,定义子类,重写父类方法

c,传递子类对象给调用者,返回不同的结果

四,完整代码如下

# 面向对象的语言#定义类
# Java   class Person{    }
# python  首字母需要大写
class Student:name='小宝'sex:strage=20def say(self):# self这个参数是当前这个对象,不需要自己传参# 可以通过self去取得自身携带的一些东西,如属性print("hello",self)# 实例化
# java  new Student()
# python
s=Student()
s2=Student()
#打印s 肯定是内存地址
# print(s)
# s.say()
# name 实例属性
s.name="张三"#添加了一个实例属性name  值是张三
Student.name="haha"#修改了类属性
# s有几个name属性? 【name类属性】【name实例属性】
del s.name #删除了name实例属性
# s.birth='2021-1-1'#不会报错,python是弱类型,对变量没有类型限制,对对象没有属性限制
print(s.name)
print(s2.name)
class Student:# 1.私有化属性__name:str__age:int# 构造函数# def __int__(self):#     pass# 构造函数def __init__(self,name:str="",age:int=0):#这里的str与int只是需要的类型,给其他类型也不会报错self.__name=nameself.__age=age#2,提供get/setdef get_name(self):return self.__namedef set_name(self,name:str):return self.__namedef __str__(self):return f"名字{self.__name},年龄{self.__age}"# def __set_name__(self, owner, name):@staticmethoddef say():print("hello")@classmethoddef test(cls):cls.__name='xxx'Student.test()
s1=Student("小宝",20)
s2=Student()
s3=Student(name="小黑")
s4=Student(age=21)
# print(s.get_name())
print(s1)
print(s2)
print(s3)
print(s4)
Student.say()
import random
# java类都直接或者间接继承object
# python类都直接或者间接继承object
# 如果属性或方法已经冲突,拿前面的
class Parent(object):name='张三 'def cook(self):print("正在煮饭[辣椒炒肉]")class Mother(object):def cook(self):print("正在煮饭[红烧肉]")# class Son(Mother,Parent):
#     pass
# class Son(Parent,Mother):
#     pass
class Son(Mother,Parent):def cook_test(self):super(Son,self).cook()print("正在煮饭[茄子豆角]")# s=Son()
# # print(Parent.mro())
# # print(Son.mro())
# s.cook()
# s.cook_test()
# print(Son.mro())
# print(Son.__mro__)
#
# random.randint()
class Cs():def cook(self):passclass Parent(Cs):def cook(self):print("正在煮饭[辣椒炒肉]")class Mother(Cs):def cook(self):print("正在煮饭[红烧肉]")class Son(Mother,Parent):def cook_test(self):super(Son,self).cook()print("正在煮饭[茄子豆角]")# # 需要一个厨师
# def mai_fan(chushi:Cs):
#     # 断言----会抛出异常
#     assert isinstance(chushi,Cs)
#     chushi.cook()# 需要一个厨师
def mai_fan(chushi:Cs):# 断言----会抛出异常if isinstance(chushi,Cs) == True:chushi.cook()else:print("你当前不是厨师")c1=Parent()
c2=Mother()
c3=Son()
mai_fan(c1)
mai_fan(c2)
mai_fan(c3)

python之类的封装,继承,多态相关推荐

  1. python 参数类型的多态_【Python】面向对象:类与对象\封装\继承\多态

    六.Python面向对象--类与对象\封装\继承\多态 1.什么是面向对象编程 1.1 程序设计的范式:程序可控,易于理解 1.2 抽象并建立对象模型 1.3 程序是不同对象相互调用的逻辑.每个对象在 ...

  2. python多态的三种表现形式_python小结----面向对象的三大特征(封装,继承,多态)

    面向对象的三大特征: 封装,继承,多态 面向对象的编程思想核心:高类聚,低耦合–程序的设计模式范畴 封装 什么是封装: 在面向对象编程的思想中,对代码进行高度封装,封装又叫包装 封装就是指将数据或者函 ...

  3. c语言编程 菲薄拉,C语言设计模式-封装-继承-多态

    快过年了,手头的工作慢慢也就少了,所以,研究技术的时间就多了很多时间,前些天在CSDN一博客看到有大牛在讨论C的设计模式,正好看到了,我也有兴趣转发,修改,研究一下. 记得读大学的时候,老师就告诉我们 ...

  4. 面向对象 编程及面向对象三大属性:封装 继承 多态

    面向对象 面向对象(Object Oriented,OO)是软件开发方法.面向对象的概念和应用已超越了程序设计和软件开发,扩展到如数据库系统.交互式界面.应用结构.应用平台.分布式系统.网络管理结构. ...

  5. Java继承_Hachi君浅聊Java三大特性之 封装 继承 多态

    Hello,大家好~我是你们的Hachi君,一个来自某学院的资深java小白.最近利用暑假的时间,修得满腔java语言学习心得.今天小宇宙终于要爆发了,决定在知乎上来一场根本停不下来的Hachi君个人 ...

  6. python--编写程序:实现乐手弹奏乐器,乐手可以弹奏不同的乐器而发出不同的声音------使用类的封装继承多态的问题/使用面向对象的思想,设计自定义类,描述出租车和家用轿车的信息

    编写程序:实现乐手弹奏乐器,乐手可以弹奏不同的乐器而发出不同的声音 ------使用类的封装继承多态的问题 class Instrumnet():#乐器类def make_sound(self):pa ...

  7. 大数据笔记8—java基础篇4(面向对象-封装-继承-多态)

    面向对象 一.面向对象 1.面向过程 1.2.举例 1.3.总结 二.面向对象 1.简述 2.举例 3.思想特点 2.1.类的定义格式 2.1.1.简述 2.2.2.格式 2.3.3.示例 三.类的使 ...

  8. 小白理解——封装继承多态

                                      一.封装 是什么:首先是抽象,把事物抽象成一个类,其次才是封装.对外表示为一个对象,隐藏对象的属性和动作实现的细节,仅对外公开接口. ...

  9. Day55-每日一道Java面试题-Java 面向对象编程三大特性: 封装 继承 多态

    Java 面向对象编程三大特性: 封装 继承 多态 封装 封装把一个对象的属性私有化,同时提供一些可以被外界访问的属性的方法,如果属性不想被外界访问,我们大可不必提供方法给外界访问.但是如果一个类没有 ...

  10. 白话文带你了解 封装 继承 多态

    这里讲的仅仅是带你理解 封装 继承 多态 染好您可以移步去别的文章学习具体的实现 (只是个人理解 您可以不爱,请别伤害哦!) 首先你要知道 java是面向对象的,说白了就是我拿你当个人,请认清你的地位 ...

最新文章

  1. 仿QQ空间用一个tableview显示多种自定义cell
  2. Oracle中的 IN, NOT IN和 EXISTS, NOT EXISTS的區別
  3. AndroidStudio3.0无法打开Android Device Monitor的解决办法(An error has occurred on Android Device Monitor)...
  4. 禁用引导模态区域之外的单击以关闭模态
  5. Kubernetes — Flannel CNI
  6. LiveGBS国标流媒体-摄像机网页低延时无插件直播实现
  7. arduino与matlab联调出现问题
  8. 安卓应用安全指南 翻译完成
  9. web测试与app测试异同
  10. 由于找不到appvisvsubsystems32.dll_终于熬到孩子上幼儿园,宝妈却找不到工作了,背后原因让人心酸...
  11. 软考初级程序员---题目(七)
  12. 史上最全英文免费编程电子书列表
  13. EXE文件反编译工具下载
  14. 仿真小白必须知道的!有限元法-它是什么?FEM和FEA解释
  15. word文字间距设置教程
  16. 单片机什么叫位寻址?/不可位寻址?
  17. 一名失败人士对大学教育的一些看法
  18. 训练误差与泛化误差的说明
  19. 一个cc1101功耗的问题
  20. 基于SpringBoot大学生心理健康咨询管理系统的分析与设计

热门文章

  1. 《Android多媒体应用开发实战详解:图像、音频、视频、2D和3D》——2.3节简析Android安装文件...
  2. python手写字母识别_手写字母数字识别_Python_SDK调用(一)
  3. 高性能Mysql——创建高性能索引详解
  4. ckplayer循环播放不能设置的问题
  5. qt实现的五子棋小游戏(Qpainter)
  6. vue自定义动画 以及animation包在vue中的使用
  7. 前端插件swiper使用新手教程
  8. logstash采集日志
  9. android听筒+扬声器自动切换,Android VOIP中的扬声器、听筒切换
  10. 微服务自动化.01etcd基本介绍