python面向对象编程:魔方法和内置属性

__init__(self)

是初始化方法,初始化实例的时候自动调用,方法有一个参数 self,代表当前创建的实例对象。__init__方法在 __new__方法的基础上完成一些初始化工作,不需要返回值。

__new__(cls)

是一个静态方法,当实例化一个类对象时,最先被调用的是__new__ 方法。该方法第一个参数 cls 表示当前要实例化的类。__new__方法必须要有返回值,是实例化对象(即self传给__init__方法),__new__()使用场景:
1、单例模式

class Singleton(object):def __new__(cls, *args, **kwargs):# 实例化类的时候,可以用于确保一个类只有一个实例存在if not hasattr(cls, '_instance'):cls._instance = super().__new__(cls, *args, **kwargs)return cls._instance

2、继承一些不可变的类时

class absint(int):# 取整数绝对值def __new__(cls, value):return super().__new__(cls, abs(value))a = absint(-1)
print(a)
__del__(self)

在实例将被销毁时调用。del x 并不直接调用 x.__del__(),前者会将 x 的引用计数减一,而后者仅会在 x 的引用计数变为零时被调用。

__repr__(self)

由 repr() 内置函数调用以用于返回一个对象的字符串表示形式。这个方法返回的字符串应该能够用来重新创建这个对象。

class Animal:def __init__(self, name, age):self.name = nameself.age = agedef __repr__(self):return f"Animal(name={self.name}, age={self.age})"obj = Animal('Tugou', 2)# 打印对象的字符串表示形式
print(obj)
# Animal(name=Tugou, age=2)
__str__(self)

通过 str(object) 用于返回一个对象的字符串表示形式。当使用 print() 或 str() 函数时Python 会调用该对象的__str__() 方法来获取字符串表示。

class Person:def __init__(self, name, age):self.name = nameself.age = agedef __str__(self):return f"{self.name}, {self.age} 岁"person = Person("Alice", 25)# 打印对象的字符串表示形式
print(person)
# Alice, 25 岁

命令行中二者的区别

class Person:def __init__(self, name, age):self.name = nameself.age = agedef __str__(self):return f"{self.name}, {self.age} 岁"def __repr__(self):return f"Person(name={self.name}, age={self.age})"# 创建一个 Person 对象person = Person("Alice", 25)
# 命令行调用
person
Person(name=Alice, age=25)
# 命令行使用print打印
print(person)
Alice, 25
__lt__(self, other)
x<y 调用 x.__lt__(y)
__le__(self, other)
x<=y 调用 x.__le__(y)
__eq__(self, other)
x==y 调用 x.__eq__(y)
__ne__(self, other)
x!=y 调用 x.__ne__(y)
__gt__(self, other)
x>y 调用 x.__gt__(y)
__ge__(self, other)
x>=y 调用 x.__ge__(y)
__hash__(self)

通过内置函数 hash() 调用以对哈希集的成员进行操作,如果一个类没有定义__eq__() 方法,那么也不应该定义__hash__() 操作

__getattr__(self, name)

访问不存的属性时调用,也就是引发 AttributeError 而失败时被调用。

__getattribute__(self, name)

此方法会无条件地被调用以实现对类实例属性的访问,也就是每当尝试访问一个对象的属性时,都会自动调用__getattribute__方法。如果类还定义了__getattr__(),则后者不会被调用,除非__getattribute__() 显式地调用它或是引发了 AttributeError。

class Person:def __init__(self, name, age):self.name = nameself.age = agedef __getattr__(self, item):'''访问不存的属性时调用,'''try:print('{} {} in __getattr__ method'.format(self, item))return object.__getattribute__(self, item)except:return 'Not find attribute: {}'.format(item)def __getattribute__(self, item):'''访问存在的属性,如果访问属性不存在的时候随后会调用__getattr__'''print('{} {} in __getattribute__ method'.format(self, item))return object.__getattribute__(self, item)person = Person("Alice", 25)person.sex
print(person.name)
<__main__.Person object at 0x00000000024FCDC8> sex in __getattribute__ method
<__main__.Person object at 0x00000000024FCDC8> sex in __getattr__ method
<__main__.Person object at 0x00000000024FCDC8> name in __getattribute__ method
Alice
__setattr__(self, name, value)

此方法在一个属性被尝试赋值时被调用。name 为属性名称, value 为要赋给属性的值。

class Person:def __init__(self, name, age):self.name = nameself.age = agedef __setattr__(self, key, value):'''设置属性,初始化的时候也要调用该方法'''print('{} {} in __setattr__ method'.format(self, key))object.__setattr__(self, key, value)person = Person("Alice", 25)person.sex = "man"
print(person.sex)<__main__.Person object at 0x0000000001F2CC08> name in __setattr__ method
<__main__.Person object at 0x0000000001F2CC08> age in __setattr__ method
<__main__.Person object at 0x0000000001F2CC08> sex in __setattr__ method
man
__call__()

允许将对象像函数一样进行调用。当一个对象实现了__call__ 方法时,您可以像调用函数一样调用该对象,即使用括号运算符 () 来调用它

class MyCallable:def __call__(self, x, y):return x + y# 创建一个可调用的对象
my_callable = MyCallable()# 调用对象,就像调用函数一样
result = my_callable(3, 5)
print(result)  # 输出: 8
__contains__(self, item)

方法用于检查对象是否包含某个元素,通常在使用 in 运算符时自动调用。

class MyList:def __init__(self, data):self.data = datadef __contains__(self, item):return item in self.datalst = MyList([1, 2, 3, 4, 5])
print(3 in lst)  # 输出: True
__iter__(self)

用于定义该类的实例是可迭代对象,并且应该返回一个迭代器。当自定义类需要支持迭代时,就需要在类中定义__iter__() 方法。

class myiterable:data = [0, 1, 2, 3]def __iter__(self):return self.datami = myiterable()
res = isinstance(mi, Iterable)  # True 是可迭代对象
print(res)
__getitem__(self, key)

用于实现通过 obj[key] 来访问对象的方法,并且支持整数索引和切片。

# requests/structures.py CaseInsensitiveDict LookupDict 实现了__getitem__
# requests/cookies.py RequestsCookieJar 
from sortedcontainers.sorteddict import SortedDictsd = SortedDict({'a': 1, 'b': 2, 'c': 3})
siv = sd.items()from collections.abc import Iterator  # 迭代器
from collections.abc import Iterable  # 可迭代对象class DataSequence:def __init__(self):self.data = [1, 2, 3, 4, 5]def __getitem__(self, index):return self.data[index]def __len__(self):return len(self.data)# def __iter__(self):#     return iter(self.data)ds = DataSequence()
print(isinstance(ds, Iterable))
print(isinstance(ds, Iterator))# 因为 for 循环会尝试按索引从 0 开始访问序列元素
for i in ds:print(i)
__slots__

这个特性可以限制类的属性,只能给类赋值__slots__里的属性,该属性不会对子类生效。类在定义的时候会根据__slots__定义的属性,来分配内存大小,从而节省空间。会阻止自动为每个实例创建__dict__ 和__weakref__。

class Student:__slots__ = 'name', 'age', 'score'def __init__(self, name, age):self.name = nameself.age = age
s.score = 99
s.sex = "male"
# 给sex赋值的时候会报错,因为__slots__里面没有sex属性
# AttributeError: 'Student' object has no attribute 'sex'
__dict__

字典形式,列出类或对象的所有属性和属性值。

class Student:def __init__(self, name, age):self.name = nameself.age = ageStudent.__dict__
# 包含所有类属性
{'__module__': '__main__', '__init__': <function Student.__init__ at 0x000001B86E44A168>, '__dict__': <attribute '__dict__' of 'Student' objects>, '__weakref__': <attribute '__weakref__' of 'Student' objects>, '__doc__': None
}
s = Student('burus', 15)
s.__dict__
# 包含实例的属性
{'name': 'zhangliang', 'age': 33
}
__class__

返回当前实例属于哪个类。

__base__

如果继承了多个类, 那么只显示继承的第一个类, 没有显示继承则返回object

__bases__

返回一个元组, 会显示所有直接继承的父类, 如果没有显示的继承, 则返回(object,)

__mro__

mro表示Method Resolution Order, 表示方法查找顺序, 会从自身除法, 找到最顶层的父类, 因此返回自身、继承的基类、以及基类继承的基类, 一直找到object

class A:passclass B:passclass C(A, B):passclass D(C):passd = D()
print(d.__class__)
<class '__main__.D'>
print(C.__bases__)
(<class '__main__.A'>, <class '__main__.B'>)
print(D.__base__)
<class '__main__.C'>
print(D.__mro__)
(<class '__main__.D'>, <class '__main__.C'>, <class '__main__.A'>, <class '__main__.B'>, <class 'object'>)

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

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

相关文章

【Redis】SSM整合Redis注解式缓存的使用

&#x1f389;&#x1f389;欢迎来到我的CSDN主页&#xff01;&#x1f389;&#x1f389; &#x1f3c5;我是Java方文山&#xff0c;一个在CSDN分享笔记的博主。&#x1f4da;&#x1f4da; &#x1f31f;推荐给大家我的专栏《Redis》。&#x1f3af;&#x1f3af; &#x1f4…

C++特殊类与单例模式

一、特殊类 类的特殊设计方式 ①不能被拷贝的类 拷贝只会放生在两个场景中&#xff1a;拷贝构造函数以及赋值运算符重载&#xff0c;因此想要让一个类禁止拷贝&#xff0c; 只需让该类不能调用拷贝构造函数以及赋值运算符重载即可 在C98中&#xff0c;需要将拷贝构造设置成…

uni-app android picker选择默认月份

微信小程序选中月份后下次再点开是上次的选中的月份&#xff0c;而编译的android应用只默认当前月份 <picker mode"date" ref"picker" :disabled"disabled" :value"date" fields"month" change"bindDateChange&quo…

【ML】分类问题

分类问题 classification&#xff1a;根据已知样本特征&#xff0c;判断输入样本属于哪种已知样本类。 常用入门案例&#xff1a;垃圾邮件检测、图像分类、手写数字识别、考试通过预测。 分类问题和回归问题的明显区别&#xff1a; 分类问题的结果是非连续型标签&#xff0c…

Netty入门指南之传统通信的问题

作者简介&#xff1a;☕️大家好&#xff0c;我是Aomsir&#xff0c;一个爱折腾的开发者&#xff01; 个人主页&#xff1a;Aomsir_Spring5应用专栏,Netty应用专栏,RPC应用专栏-CSDN博客 当前专栏&#xff1a;Netty应用专栏_Aomsir的博客-CSDN博客 文章目录 参考文献前言多线程…

基于APM(PIX)飞控和missionplanner制作遥控无人车-从零搭建自主pix无人车无人坦克

前面的步骤和无人机调试一样&#xff0c;可以参考无人机相关专栏。这里不再赘述。 1.安装完rover的固件后&#xff0c;链接gps并进行校准。旋转小车不同方向&#xff0c;完成校准&#xff0c;弹出成功窗口。 2.校准遥控器。 一定要确保遥控器模式准确&#xff0c;尤其是使用没…

轻量封装WebGPU渲染系统示例<20>- 美化一下元胞自动机(源码)

当前示例源码github地址: https://github.com/vilyLei/voxwebgpu/blob/feature/rendering/src/voxgpu/sample/GameOfLifePretty.ts 系统特性: 1. 用户态与系统态隔离。 2. 高频调用与低频调用隔离。 3. 面向用户的易用性封装。 4. 渲染数据(内外部相关资源)和渲染机制分离…

redis-plus-plus访问REDIS集群

编程语言&#xff1a;C 开源库&#xff1a;redis-plus-plus 接口类&#xff1a;RedisCluster 初始化需要输入任意一个结点的IP和端口&#xff0c;如果设置了密码&#xff0c;还需要密码的明文并使用ConnectionOptions类。 初始化完成后可以直接进行读/写操作。 RedisClust…

网络唤醒(Wake-on-LAN, WOL)

远程唤醒最简单的方法&#xff1a;DDNSTOOpenwrt网络唤醒&#xff0c;完美实现。 原帖-远程唤醒_超详细windows设置远程唤醒wol远程连接&#xff08;远程开机&#xff09; WOL Web# 访问 Wake on Lan Over The Interweb by Depicus 可以无需借助软件很方便的从网页前端唤醒远…

使用Anaconda安装TensorFlow环境以及没有搜到的报错的解决方法

1.在官网下载Anaconda 这一步几乎不会有人报错 下稳定的版本 或者最新的版本都可以 2.TensorFlow分两个版本 一个是用cpu跑 另一个是用gpu跑 显而易见 cpu的计算性能已经比不上现在主流的显卡了 所以有独显的电脑尽量安装gpu版本 CPU版本: 先给出cpu版本的安装方法: 打开A…

描述低轨星座的特点和通信挑战,以及它们在5G和B5G中的作用。

文章目录 2章4 章5章&#xff08;没看&#xff09;6章&#xff08;没看&#xff09; 2章 将卫星星座中每个物理链路中可实现的数据速率、传播延迟和多普勒频移与3GPP技术报告中的参数进行分析和比较[3]。 相关配置 面向连接的网络&#xff0c;预先简历链路 卫星和地面终端有…

Unraid 无法远程访问 Web UI 的解决方法

在将 Unraid 系统升级到 6.12.1 版本之后&#xff0c;发现无法通过 ZeroTier 或蒲公英在外网访问 Unraid 的 Web 页面&#xff0c;但是直接访问 Docker 的端口可以正常访问。 初步判断&#xff0c;这很有可能是默认的 80 端口出现了问题。Unraid 的 Web 服务器默认监听 80 端口…

自动化测试--验证邮件内容

场景 业务上有许多发送邮件的场景&#xff0c;发送的邮件基本上都是自动发送的&#xff0c;而且邮件内容是很重要的&#xff0c;对于邮件发没发送&#xff0c;发送的时间点对不对每次回归测试工作量太大了&#xff0c;所以考虑把这部分内容加入到自动化测试中 工具 python g…

了解计算机的大小端存储模式

我们在计算机中存储数据时&#xff0c;数据是如何组织和表示的是一个重要的问题。其中一个关键概念是 大小端存储模式&#xff08;Endianness&#xff09;&#xff0c;它描述了多字节数据在内存中的存储方式。本文将介绍大小端存储模式的原理、应用和区别。 什么是大小端存储模…

通过全流量查看部门或客户端网络使用情况

近年来&#xff0c;随着数字化转型和云计算服务的广泛应用&#xff0c;组织和企业对于网络带宽和性能的需求也在不断增长。 网络的稳定性、性能和安全性对于业务流程的顺畅运行至关重要。因此&#xff0c;了解部门或客户端网络的使用情况是网络管理和优化的关键。本文将通过Ne…

Docker数据管理、网络与Cgroup资源限制

目录 一、Docker的数据管理 1、数据卷 2、数据卷容器 3、端口映射 4、容器互联 二、Docker网络 2.1Docker网络实现原理 2.2Docker 的网络模式 3.3网络模式详解&#xff1a; host模式 container模式 none模式 bridge模式 自定义网络 创建自定义网络 三、Cgroup资源…

Maven修改仓库和镜像地址

目录 1、修改仓库地址2、修改镜像地址 1、修改仓库地址 使用IDEA时,如果不指定自己下载的Maven,idea会默认使用自带的Maven 3&#xff08;bundle)。maven 3默认的仓库路径一般是在c盘的用户文件夹中的.m2目录下&#xff1a; 当maven下的pom文件中的依赖逐渐增加时,maven仓库下…

k8s报错pause 3.2 解决方案

报错 Failed to create pod sandbox: rpc error: code Unknown desc failed to get sandbox image "k8s.gcr.io/pause:3.2": failed to pull image "k8s.gcr.io/pause:3.2": failed to pull and unpack image "k8s.gcr.io/pause:3.2": failed…

Hook函数

在嵌入式系统中&#xff0c;hook函数&#xff08;也被称为钩子函数&#xff09;是一种特殊类型的函数&#xff0c;它会在特定的事件发生时被操作系统内部调用。例如&#xff0c;在实时操作系统&#xff08;RTOS&#xff09;中&#xff0c;如果删除了一个任务&#xff0c;就会调…

0基础学习VR全景平台篇第116篇:认识修图软件Photoshop

上课&#xff01;全体起立~ 大家好&#xff0c;欢迎观看蛙色官方系列全景摄影课程&#xff01; 今天给大家讲解修图软件Photoshop&#xff0c;下面我们开始吧&#xff01; &#xff08;PS软件课程大纲&#xff09; 1.Photoshop是什么 发明人Adobe Photoshop&#xff0c;简称…