深入类和对象

Python进阶第一讲之抽象基类的理解 本帖主要介绍了抽象基类,以及通过代码的方法进一步去理解抽象基类的作用。 阅读详情

鸭子类型和多态

多态的概念是应用于java和C#这一强类型语言中,而python崇尚“鸭子类型”。

动态语言用实例方法时不检查类型,只要方法存在,参数正确,就可以调用。这就是动态语言的“鸭子类型”,并不要求严格的继承体系,一个对象只要“看起来像鸭子,走路像鸭子”,那它就可以被看做是鸭子。

多态简单理解,定义时的类型和运行时的类型不一样

抽象基类

抽象基类(abstract base class,ABC):抽象基类就是类里定义了纯虚成员函数的类。纯虚函数只提供了接口,并没有具体实现。抽象基类不能被实例化(不能创建对象),通常是作为基类供子类继承,子类中重写虚函数,实现具体的接口。

抽象基类就是定义各种方法而不做具体实现的类,任何继承自抽象基类的类必须实现这些方法,否则无法实例化。

特点

  • 要定义但是并不完整的实现所有方法
  • 基类的意思是作为父类
  • 父类要明确表示出方法的特征,这样在写子类时更加简单明白

应用

  • 用作父类
  • 用作检验实例类型
  • 用作抛出异常说明
from collections.abc import Sized, Container


class People(object):
    def __init__(self, name):
        self.name = name

    # 如果没有__len__魔法方法,不能判断类中字符串的长度
    def __len__(self):
        return len(self.name)

    def __contains__(self, item):
        self.item = item


a = People(['cat', 'dog'])
print(len(a))
# 判断a对象中是否包含__len__属性
print(hasattr(a, '__len__'))
# 判断a对象是否是Sized类型
print(isinstance(a, Sized))
print(isinstance(a, Container))
# 2
# True
# True
# True

hasttr(object, name) 返回object对象是否具有该name属性

isinstance(object, A_tuple): 返回对象是否属于该类或是其子类,如果是tuple,判断改对象是否属于该tuple

from collections.abc import Sized, Container
print(isinstance(a, Sized))
print(isinstance(a, Container))

# 在python文件夹下,lib->_collections_abc.py可以看到该库的源码
class Sized(metaclass=ABCMeta):

    __slots__ = ()

    @abstractmethod
    def __len__(self):
        return 0

    @classmethod
    def __subclasshook__(cls, C):
        if cls is Sized:
            return _check_methods(C, "__len__")
        return NotImplemented

如果类中有__len__,name它就是一个Sized类型,Sized方法就是一个抽象基类

import abc


# 定义抽象基类
class Animal(metaclass=abc.ABCMeta):
    @abc.abstractmethod
    def eat(self, food):
        pass

    @abc.abstractmethod
    def voice(self, sound):
        pass


class Dog(Animal):
    # 子类中方法重写
    def eat(self, food):
        pass
    
    # 方法重写
    def voice(self, sound):
        pass


d = Dog()
d.eat('bone')

子类中方法必须重写,否则报错

isinstance 与 type 的区别

  • type 不考虑继承关系
  • isinstance 考虑继承关系
class B(object):
    pass


class C(B):
    pass


b = C()
print(isinstance(b, C))
print(isinstance(b, B))
print(type(b) is C)
print(type(b) is B)
# True
# True
# True
# False

== 与 is 的区别

  • ==是值相等
  • is是内存地址是否相等
x = y = [1, 2]
z = [1, 2]
print(x == z)
print(x is y)
print(x is z)
print(id(x))
print(id(y))
print(id(z))
# True
# True
# False
# 2041717547528
# 2041717547528
# 2041717547592

对象变量

class A(object):
    # 类属性
    aa = 22
    
    # 实例属性
    def __init__(self, x, y):
        # 实例方法
        self.x = x
        self.y = y


a = A(1, 2)
print(id(a))
print(id(A))
A.aa = 11
print(id(a))
print(id(A))
b = A(1, 2)
print(id(b))
# 1918674761712
# 1918640702312
# 1918674761712
# 1918640702312
# 1918674761600

当改变A.aa时,是在原内存地址上修改了值,id不变

当创建b对象时,会在内存空间中重新开辟一块区域,所以id不同

类属性和实例属性的查找顺序

python2.3之后采用了C3算法(大佬文章):https://www.cnblogs.com/blackmatrix/p/5644023.html

# 假设一个类继承关系如下
class D:
    pass

class B(D):
    pass

class E:
    pass

class C(E):
    pass

class A(B, C):
    pass

# 通过__mro__方法可以查看继承的顺序
print(A.__mro__)
# (<class '__main__.A'>, <class '__main__.B'>, <class '__main__.D'>, <class '__main__.C'>, <class '__main__.E'>, <class 'object'>)
# ABDCE

python对象的自省机制

自省是通过一定的机制查询到对象的内部结构

比较常见的自省(introspection)机制有:dir(),type(),hasttr(),instance(),通过这些函数,我们能够在程序运行时得知对象的类型,判断对象是否存在某个属性。

class Person(object):
    name = 'shell'


class Student(Person):
    def __init__(self, school):
        self.school = school


s = Student('北大')
print(dir(s))
print(s.__dict__)
# ['__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', 'school']
# {'school': '北大'}

有一定的局限性,弗雷中的属性不能访问到

a = [1, 2]
print(dir(a))
print(dir(list))

上面两个结果是一样的,说明dir只是在访问list()中有哪些方法,并不能访问值

super函数

在类的继承中,如果重定义某个方法,该方法会覆盖父类的同名方法,但有时,我们希望能同时实现父类的功能,这时,我们就需要调用父类的方法了,可通过使用super来实现。

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

    def speak(self):
        print('%sspeak:i am %d years old' % (self.name, self.age))


class Student(People):
    def __init__(self, name, age, grade):
        super().__init__(name, age)
        self.grade = grade


s = Student('jd', 18, 3)
s.speak()
print(Student.__mro__)

即使有super函数类的执行顺序同样是满足mro算法的

JLink版本不兼容?手把手教你解决APM32F003F6P6在Keil中烧写闪退和报错 本文详细解析了APM32F003F6P6在Keil中烧写闪退和报错的解决方案,重点介绍了JLink版本兼容性问题。通过实测不同版本组合,推荐使用JLink 7.20a或6.86b与Keil 5.25的黄金组合,并提供详细的降级驱动和工程配置步骤,帮助开发者高效解决烧写困境。 阅读详情

相关推荐

Windows Server+SqlServer Always On实战:5步搞定高可用集群搭建

本文详细介绍了在Windows Server环境中,通过5个关键步骤搭建SQL Server Always On高可用集群的实战指南。内容涵盖从底层故障转移集群配置、SQL Server实例启用Always On功能,到创建可用性组和侦听器的完整流程,并提供了核心运维与故障排查思路,帮助企业构建稳定可靠的数据库高可用架构。

milk5的博客 857

python-深入类和对象

1.鸭子类型与多态 鸭子类型 多态的概念是应用于Java和C#这一类强类型语言中,而Python崇尚"鸭子类型"。 动态语言调用实例方法时不检查类型,只要方法存在,参数正确,就可以调用。这就是动态语言的“鸭子类型”,它并不要求严格的继承体系,一个对象只要“看起来像鸭子,走起路来像鸭子”,那它就可以被看做是鸭子。 #鸭子类型 在运行之前 Cat,Dog都是在列表里面,当作变量 #当运行时,加上()调用info() 才明确Cat是一个类 class Cat(object): def info(self)

zjb5599的博客 480

开源PACS系统Orthanc(DICOM服务器)配置

PACS(Picture Archiving and Communication System)是医学影像的数字化存储、检索和传输系统,用于管理和存储医学图像和相关信息,如放射学、核医学、超声、病理学等各种医学影像。PACS系统通过数字化技术取代了传统的胶片方式,使医疗机构能够更高效地存储、传输和查看医学图像,从而提高了医疗图像的管理和工作流程。

qq_42231043的博客 6249

python中的抽象基类

python中的抽象基类

qq_43745578的博客 1872

FRM模型五:Brinson业绩归因

利用Brinson对基金组合业绩进行归因分析。

stonesssssss的博客 3003

【技术分享】ArcGIS Pro底图色彩优化实战:从DEM到山体阴影的进阶调色技巧

本文深入探讨了在ArcGIS Pro中优化地形底图色彩的进阶技巧。通过分析DEM与山体阴影的直方图,详细讲解了如何运用图层混合、亮度、对比度及伽马值等核心参数进行精细化调色,从而将灰暗平淡的地图转化为层次分明、视觉美观的专业成果。

5b6n7m8的博客 759

python的数据类型

一、.Python的优缺点: 优点:代码简洁易读 ,易开发 缺点:运行效率慢 c语言:预编译把代码转换成机器语言 (运行速度快) python:顺序执行,直接读代码(运行速度慢) 1、python的格式 # _*_coding:utf-8_*_ # 1.没有分号 # 2.严格按照缩进的语言 print('hello python') print('你好 python') ...

dghfttgv的博客 432

服务器被黑?快速检测和识别系统中的恶意进程

在管理服务器时,检测和识别系统中的恶意进程至关重要。本文介绍了使用 `ps`、`top`、`htop` 等系统监控工具,分析日志文件,以及使用 `chkrootkit` 和 `rkhunter` 等安全工具的方法。通过这些步骤,可以有效地检测和处理恶意进程,确保系统的安全和稳定。

_midnight的博客 1416

<Fluent Python>Python的数据结构-字典

文章目录1 泛映射类型1.1 字典的键必须是可散列的2 字典推导式3 字典实现的魔法方法4 字典怎么处理找不到的键5 __missing__特殊方法6 标准库中特殊的字典6.1 OrderedDict6.2 ChainMap6.3 Counter7 子类化UserDict8 剖析抽象基类-Sized为例 字典类型是Python语言的基石。字典有关的内置函数在 __builtins__.__dict__ Python使用散列表对字典进行了优化,使得字典查询时间复杂度能够达到O(1) 1 泛映射类型 _col

kobe_okok的博客 306

四足狗机器人硬件开发技术栈详解

本文系统介绍了四足狗机器人的硬件开发技术,重点分析了五大核心模块:机械结构(骨架设计)、动力系统(关节驱动)、感知系统(环境监测)、控制系统(决策中枢)和电源系统(能源管理)。文章详细阐述了各模块的选型标准、技术要点和协同设计原则,提供了从需求定位到组装调试的完整开发流程,并针对常见问题给出解决方案。随着材料轻量化、模块标准化和AI集成化的发展趋势,四足机器人硬件将向更灵活、更智能的方向演进,为工业巡检、应急救援等场景提供更强大的移动平台支持。

start_up_go的博客 284

Android15 修改触摸点上限为40

把MAX_POINTER_ID从默认的31修改为39,这里为什么要从31修改为39,是因为上面说明用BitSet32极限就只能支持32个点,因为从最小的ID是0,所以要支持40个点ID也要对应改为39.最近有个需求,需要修改Android系统的触摸点数,Android系统默认的点数是16个点,因为现在是大屏项目,有客户需要修改为40个点,好吧,客户最大。6.最后进行编译,开机开启触摸点检测,可以使用开发者模式中的显示触摸点功能,再叫上3个人,用双掌触摸屏幕,发现左上角有显示40个触摸点,修改成功。

tzj1058756809的博客 573

类和对象——初步了解面向对象和什么是类

一篇文章认识类。

m0_73693552的博客 1005

日常工作记录---在虚拟机中进行slam建图

   今天是10月24号,首先祝各位程序员们节日快乐!!!    最近一周由于实习的原因,对ROS的探索学习,停滞了一段时间,所以今天也就没什么大的进展,本篇文章仅仅记录一下,我在虚拟机中进行slam建图可行性验证的过程,本篇文章同样使用古月学院《如何在Gazebo中实现阿克曼转向车的仿真》的课程资料来进行验证    下面各条之间并没有严格的顺序关系,每一条都是独立的,都是我在验证过程中的经验或者记录:    1、在运行roslaunch bringup racecar_gazebo_rviz.lau

慕羽★的博客 4828

【JAVA】类和对象

万字详解JAVA中的类和对象,你确定不要看看?

做梦都想要三十万年薪~ 4137

C# WinForm 基于DirectShow.dll编写的程序,可边预览边保存视频,音频和图片

基于微软的DirectShow.dll的二次开发1.自动识别连接的摄像头跟麦克风且可以对其进行选择(默认选中第一个)2.可录制wmv和avi两种格式的视频并且都带有音频,avi可以录制的分辨率和帧数进行选择,wmv默认进行了淸晰度优化如不喜欢可去除代码中有相关提示3.可在预览点开之后进行拍照,也可边录制视频边拍照4.添加了视频和音频的压缩功能(酌情使用)这次二次开发发现C#对DirectShow的相关信息太少,这次做完也不敢藏私共享出来,还望大家指正

Statistics and Machine Learning Toolbox

Statistics and Machine Learning Toolbox(带书签),MATLAB统计学习工具

Python类和对象

类是创建对象的 ”模板”。数据成员:表明事物的特征。相当于变量方法成员:表明事物的功能。相当于函数通过class关键字定义类。

ZHINV_的博客 854

jre9下载 jdk9

(Java SE Runtime Environment 9.0) 9.0u175 官方最新版 【x86|x64】

【C++】类和对象

类的基本思想是数据抽象(data abstraction)和封装(encapsulation)。数据抽象是一种依赖于接口(interface)和实现(implementatino)分离的编程技术。对象是类的实例,类是对象的模板。

jmlangel_的博客 5955

数学建模模型总结

这是本人在两年内准备参加数学建模竞赛搜集到的模型资料,已经经过了本人的筛选和整理,希望能够对准备参加数学建模竞赛的学弟学妹们提供一些帮助!

什么是类和对象

类与对象一:类是什么 类是一种用户自定义的数据类型包含 一、属性:数据 二、行为:函数 总的来说类里面有数据和函数 二、对象是什么: 使用类类型定义的变量 三、类和对象的关系 类是对象的抽象(归纳总结) 对象是类的具体(实例) 类是具有相同属性和行为的对象的集合 对象是有具体数据值的类 类成员访问属性修饰关键字 公有属性 public 私有属性 private 保护属性 protected 如果在定义类的时候没有写这些,那么类成员就会被系统默认为是私有属性 访问属性修...

m0_65334415的博客 9466

关于类和对象

Java是纯面向对象语言,要求所有代码都必须放在类中,创建对象必须通过“new + 构造方法”。// 1. 定义学生类(类名首字母大写,规范) public class Student { // 实例属性(每个对象独有):访问修饰符 private 保证封装性 private String studentId;// 学号 private String name;// 姓名 private int score;

2401_89241892的博客 997

【C++】类和对象核心总结

类的引入+定义(struct ==> class),类的访问限定符+封装+作用域,类的实例化(类 类型创建对象的过程)+计算类的大小(考虑内存对齐),隐藏的this指针,类的六个默认成员函数,初始化列表(声明远远不够,还得定义对象),explict关键字,static成员,友元,内部类,匿名对象,编译器优化

小羊study_sheep的博客 5593

类和对象(1) —— 类和对象的概念、类的实例化和初始化、构造方法和this关键词

学习Java中的类和对象对于掌握面向对象编程(OOP)至关重要,类是创建对象的蓝图或模板,而对象是类的实例。学习Java类和对象不仅对于理解面向对象编程至关重要,而且对于提高你的编程技能、解决问题的能力和就业前景都非常有帮助。

2301_80030290的博客 1632

类和对象中

可以看到这里构造两次就调用两次析构完成内存的清理。但是Date类中没有需要释放的空间所以没有什么用。但在我们栈和队列中都尤为重要。构造与析构顺序:st1先构造,st2后构造,st2先析构,st1后析构,st1, st2是存在栈中(先进后出)的,但st1, st2指向的空间是堆上面的,堆上的资源不手动释放是不会释放的。5.跟构造函数类似,我们不写编译器自动生成的析构函数对内置类型不做处理,自定义类型成员会调用他的析构函数。

2301_80200332的博客 1604

类和对象

C++面向对象的三大特性为:‍C++认为,对象上有其属性和行为‍例如:人可以作为对象,属性有姓名、年龄、身高、体重……,行为有走、跑、跳、吃饭、唱歌车也可以作为对象,属性有轮胎、方向盘、车灯……,行为有载人、放音乐、放空调……具有相同性质的,我们可以抽象为,人属于人类,车属于车类‍。

wujiale123456的博客 2615

Java类和对象

面向对象是解决问题的一种思想,主要依靠对象之间的交互完成一件事情。类是用来对一个实体(对象)来进行描述的,主要描述该实体(对象)具有哪些属性(外观尺寸等),哪些功能(用来干 啥),描述完成后计算机就可以识别了在java中定义类时需要用到class关键字,具体语法如下// 创建类field;// 字段(属性) 或者 成员变量method;// 行为 或者 成员方法class为定义类的关键字,ClassName为类的名字,{}中为类的主体。(关键字+类的名称+主体)//外卖平台// 食品// 商家。

2301_80176093的博客 2854

C++ ——类和对象

C++ ——类和对象C++ ——类和对象C++ ——类和对象C++ ——类和对象C++ ——类和对象C++ ——类和对象

weixin_49376454的博客 1230

类和对象(上)

书接上回,学完了c++一些简单基础后我们就可以开始学类和对象了,类和对象一共分为三章,第一章比较基础,讲的是类和对象的定义,类的使用,对象的概念和对象的使用。提示:以下是本篇文章正文内容,下面案例可供参考class为定义类的关键字,Stack为类的名字,{}中为类的主体,注意类定义结束时后⾯分号不能省 略。类体中内容称为类的成员:类中的变量称为类的属性或成员变量;类中的函数称为类的⽅法或 者成员函数。

2301_80975278的博客 1633

Java中的类和对象

Java类和对象“速成”

2301_81375781的博客 1226
上一篇: MySql操作规范
下一篇: 类与对象深度问题与解决技巧
shell-x
博客等级 码龄7年 16粉丝 59原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值