Python进阶之深入类和对象

devtools/2024/9/22 18:32:48/

鸭子类型

鸭子类型实际上类似于多态的概念。指的是我们在使用一个父类的时候,不关心子类具体是什么,只要之类实现了父类必须要要实现的方法,我们就把它当成父类使用。

在下面的案例中,鸭子,猫,狗都是动物,我们调用它们属于动物的方法。

python"># a = [1,2]
# b = [2,3]
# c = (5,6)
# d = "abc"# a.extend(b)
# a.extend(c)
# a.extend(d)
# print(a)"""
鸭子类型 在运行之前 Cat,Dog都是在列表里面,当作变量
当运行时,加上()调用info() 才明确Cat是一个类
"""class Cat(object):def info(self):print("i am cat")class Dog(object):def info(self):print("i am dog")class Duck(object):def info(self):print("i am duck")animal_list = [Cat, Dog, Duck]  # 变量for animal in animal_list:animal().info()

判断是否含有 __len__ 魔法方法

python">"""
abc模块 abc.py  不要以abc为模块名称
"""
from collections.abc import Sizedclass Demo(object):def __init__(self, li):self.li = lidef __len__(self):return len(self.li)l = ["A", "B", "C"]
d = Demo(l)
# print(d)     # <__main__.Demo object at 0x00000183FF03A2B0>
# print(len(d))  # 会触发__len__  return len(self.li)  所以 返回3"""
如何判断 Demo中 是否 含有 __len__魔法方法
"""
# print(hasattr(d,"__len__"))  # 判断 d的内部 是否含有__len__   返回值为 布尔"""
可以通过判断 d 是否是 Sized的子类  然后进一步判断 d这个对象的类 是否 含有 __len__方法
"""# 判断d 是否是 Sized 这个类
print(isinstance(d, Sized))    # True 说明d 是Sized 类型

isinstance 与 type 基础使用

python">a = 1
b = "耗子"print(isinstance(b, (int, str)))  # 返回值为布尔值  ()-->or
print(type(a))  # <class 'int'>  int

继承和isinstance

is比较的是内存地址。

== 比较的是值。

python">class Father(object):passclass Son(Father):passls = Son()
print(isinstance(ls, Son))  # True
print(isinstance(ls, Father))  # True  继承print(type(ls) is Son)  # True
print(type(ls) is Father)  # False 并不考虑继承关系 主要 两个类# print(f"Son_id:{id(Son)},Father_id:{id(Father)}")

类属性和实例属性

python">class Father:"""父类"""# 类属性num = 1def __init__(self, a, b):# 实例属性self.a = aself.b = b# 实例化对象
zs = Father(1, 2)
print(zs.num, zs.a, zs.b)

修改类属性

python">class Father:"""父类"""# 类属性num = 1def __init__(self, a, b):# 实例属性self.a = aself.b = b# 实例化对象
zs = Father(1, 2)# 通过类名修改类属性
Father.num = 333
print(zs.num, zs.a, zs.b)# 通过对象修改类属性
zs.num = 222
print(zs.num, zs.a, zs.b)

super调用父类

python">class Father:"""父类"""# 类属性num = 1def __init__(self, a, b):# 实例属性self.a = aself.b = bclass Child(Father):def __init__(self, a, b):# 初始化父类super(Child, self).__init__(a, b)zs = Child(11, 22)
print(zs.a, zs.b)

http://www.ppmy.cn/devtools/42396.html

相关文章

javascript的typeof返回哪些数据类型

在JavaScript中&#xff0c;typeof 是一个一元运算符&#xff0c;它返回表示一个未计算的操作数类型的字符串。以下是 typeof 可能返回的数据类型字符串&#xff0c;以及如何使用它们&#xff1a; "undefined"&#xff1a; 如果变量已声明但未被赋值&#xff0c;则…

2024-5-23 石群电路-14

2024-5-23&#xff0c;星期四&#xff0c;22:20&#xff0c;天气&#xff1a;晴&#xff0c;心情&#xff1a;晴。今天没有什么重要的事情发生&#xff0c;心情一如既往的平静&#xff0c;距离返校假期还有两天~~~。 今天观看了石群老师电路基础课程的第23/24个视频&#xff0…

virtualbox 装windows7 ,但是只能ping通宿主机,无法ping通网络和上网

virtualbox 装windows7 &#xff0c;使用桥接&#xff0c;但是只能ping通宿主机&#xff0c;无法ping通网络&#xff0c;怎么回事呢&#xff1f; ChatGPT的回答&#xff1a; 解决 VirtualBox 无法 Ping 通网络的问题 如果你在 VirtualBox 中安装了 Windows 7&#xff0c;但只…

Linux——进程信号(一)

1.信号入门 1.1生活中的信号 什么是信号? 结合实际红绿灯、闹钟、游戏中的"&#xff01;"等等这些都是信号。 以红绿灯为例子&#xff1a; 一看到红绿灯我们就知道&#xff1a;红灯停、绿灯行&#xff1b;我们不仅知道它是一个红绿灯而且知道当其出现不同的状况…

法语培训柯桥法语学习法语入门基础发音学习法语留学考级旅游

一般来说&#xff0c;quelquun指的是一个不确定的人&#xff1a; 要么我们不知道到底是谁&#xff1a; Quelquun a boulott mon croissant ! 有人吃了我的羊角面包&#xff01; 要么我们不想说是谁&#xff1a; Quelquun ma assure que vous tiez capable de tout pour un cr…

学习Uni-app开发小程序Day16

今天是基础学习的最后一天&#xff0c;把前面学的做个小的案例&#xff0c;就是一个请求网络的功能。这里面牵扯到的知识点&#xff0c;这边说下&#xff1a;上拉加载更多、下拉刷新(点击刷新、置顶&#xff0c;浮框设计&#xff09;、网络请求、预览图片、拓展组件&#xff08…

JAVA在Spring框架多线程时调用服务类方法

一 Spring框架多线程调用服务类的方法 我们在开发Web的项目时&#xff0c;有时候我们想在线程的环境下使用Service或Component 注解的服务类方法&#xff0c;多线程下是不能直接调用&#xff0c;以下总结一些常用的技巧转换成可调用的形式。 二 Spring框架下多线程下调用动态…

高中数学:平面向量-数乘运算

一、定义 顾名思义 向量的数乘运算&#xff0c;就是数量与向量相乘的运算 λ a → \mathop{a}\limits ^{\rightarrow} a→&#xff0c;λ∈R 二、λ a → \mathop{a}\limits ^{\rightarrow} a→的性质 1、长度 |λ|*| a → \mathop{a}\limits ^{\rightarrow} a→| |λ a …