python中针对类本身的方法

news/2025/1/21 12:07:30/文章来源:https://www.cnblogs.com/lmc7/p/18683392

当你提到 __getattribute__ 时,它是 Python 中一个特殊的方法,用于访问对象的属性。重载该方法可以控制访问实例属性的行为。在 Python 中,__getattribute__ 是所有属性访问的基础方法,每次你访问对象的属性时,都会调用它。除了 __class____mro____dict__ 等方法之外,__getattribute__ 也与类密切相关,特别是在重载该方法时,它可以通过类来定制属性访问。

1. __getattribute__

  • 作用:重载该方法以定制属性访问的行为。它会在你访问对象的任何属性时被自动调用。此方法接收两个参数:selfname(属性的名称)。
  • 用法self.__class__.__getattribute__(self, 'attr_name') 通过类来获取对象的属性。如果你重载 __getattribute__,会影响所有属性访问行为。
  • 示例
    class MyClass:def __init__(self, value):self.value = valuedef __getattribute__(self, name):print(f"Getting attribute: {name}")return super().__getattribute__(name)  # 调用父类的 __getattribute__obj = MyClass(10)
    print(obj.value)
    # 输出:
    # Getting attribute: value
    # 10
    

2. __class__

  • 作用:指向对象的类。
  • 用法self.__class__ 返回当前对象所属的类。
  • 示例
    class MyClass:passobj = MyClass()
    print(obj.__class__)  # 输出: <class '__main__.MyClass'>
    

3. __mro__ (Method Resolution Order)

  • 作用:获取当前类的继承顺序(类的层次结构)。返回一个元组,元组中的元素是类,从当前类到 object 类。
  • 用法self.__class__.__mro__ 返回继承顺序。
  • 示例
    class A:passclass B(A):passclass C(B):passobj = C()
    print(obj.__class__.__mro__)
    # 输出: [<class '__main__.C'>, <class '__main__.B'>, <class '__main__.A'>, <class 'object'>]
    

4. __dict__

  • 作用:获取当前类或对象的属性字典,包含类或对象的所有属性(包括方法)。
  • 用法self.__class__.__dict__ 可以查看类定义中的所有属性和方法。
  • 示例
    class MyClass:x = 10def method(self):return self.xobj = MyClass()
    print(obj.__class__.__dict__)  # 输出类中的属性和方法
    

5. __name__

  • 作用:获取类的名称。通常通过 self.__class__.__name__ 来获取类的名字。
  • 用法self.__class__.__name__ 返回类的名称(字符串)。
  • 示例
    class MyClass:passobj = MyClass()
    print(obj.__class__.__name__)  # 输出: 'MyClass'
    

6. __base__

  • 作用:获取当前类的父类(基类)。如果没有父类则返回 object
  • 用法self.__class__.__base__ 返回父类。
  • 示例
    class A:passclass B(A):passobj = B()
    print(obj.__class__.__base__)  # 输出: <class '__main__.A'>
    

7. super()

  • 作用:返回当前类的父类(或者更上层的类)的实例,通常用于调用父类的方法。
  • 用法super() 用于多重继承中访问父类方法。
  • 示例
    class A:def speak(self):print("A speaking")class B(A):def speak(self):super().speak()  # 调用父类的 speak 方法print("B speaking")obj = B()
    obj.speak()
    # 输出:
    # A speaking
    # B speaking
    

8. __init____new__

  • 作用__init__ 是类的构造函数,负责初始化新创建的实例;__new__ 是类的构造方法,负责创建实例对象。
  • 用法__init__ 在实例化时调用,__new__ 用于控制对象的创建过程,通常在元类或单例模式中使用。
  • 示例
    class MyClass:def __init__(self, name):self.name = namedef __new__(cls):print("Creating instance")return super().__new__(cls)obj = MyClass("Test")
    print(obj.name)  # 输出: Test
    

9. __del__

  • 作用:析构函数,当对象被销毁时调用。主要用于释放资源(例如文件、网络连接等)。
  • 用法__del__ 是类的一个特殊方法,用于清理资源。
  • 示例
    class MyClass:def __del__(self):print(f'{self} is being destroyed.')obj = MyClass()
    del obj  # 输出: <__main__.MyClass object at ...> is being destroyed.
    

10. __call__

  • 作用:使得类的实例像函数一样可调用。当类的实例被调用时,__call__ 方法会被触发。
  • 用法self.__class__.__call__(self, ...) 使得对象能够像函数一样被调用。
  • 示例
    class MyClass:def __call__(self, x):return x * 2obj = MyClass()
    print(obj(5))  # 输出: 10
    

11. __slots__

  • 作用:限定类实例只能有特定的属性。通过 __slots__,可以避免为实例动态创建属性字典,从而节省内存。
  • 用法self.__class__.__slots__ 用于定义哪些属性可以在对象上使用。
  • 示例
    class MyClass:__slots__ = ['x', 'y']obj = MyClass()
    obj.x = 10
    obj.y = 20
    # obj.z = 30  # 会抛出 AttributeError,因为没有 z 属性
    

总结

这些方法和属性都与类和对象相关,它们有助于你访问类的元数据、控制类的行为、优化内存使用、以及管理类的继承关系。通过这些方法,你可以更灵活地管理和控制类及其对象的生命周期和行为,特别是当涉及到继承、属性访问控制、资源管理时。

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

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

相关文章

语音播报,套件多少异常的问题。(含源代码)

在工作中遇到一家工厂老板的需求:因为产品是有多个配件组成,在生产的时候,经常会多生产,少生产,在组装时,也会出现配件多少的问题,现就此问题设计一款程序。多出,少的,异常的,正常好,会开语音播报。现将全部代码给出以备。 import inspect import os import threadi…

EDMA3学习笔记1

1.1 EDMA3简介 EDMA3(Enhanced Direct Memory Access 3):增强型直接存储器访问的控制器。它是DSP中一个高级数据传输引擎,其结构适合数据的高速传输,可以在没有CPU主要参与的情况下,由控制器完成数据转移,主要服务外部内存(DDR)、片上内存(L2 SRAM)以及串口外设等。…

又一个新项目完结,炸裂!

除了全程直播讲解的、50 个小时的保姆级视频教程之外,我还写了整套文字教程(15 万多字),细致入微!大家好,我是程序员鱼皮。经过了 2 个月的爆肝,我在自己的编程导航的第 11 套有 保姆级教程 的大项目 —— 企业级智能协同云图库平台,完结啦!除了全程直播讲解的、50 个…

kylin V10 SP2 离线单机部署tidb v8.3.0

准备离线组件包 在官方下载页面选择对应版本的 TiDB server 离线镜像包(包含 TiUP 离线组件包)。需要同时下载 TiDB-community-server 软件包和 TiDB-community-toolkit 软件包。 部署离线环境TiUP组件 将离线包传至服务器,执行以下命令安装 TiUP 组件: tar zxvf tidb-comm…

生成型AI应用的质量为何常常不尽人意,以及如何改进

生成型AI应用的质量为何常常不尽人意,以及如何改进2025年,图片来源:elements.envato.com,Marcel Mller 编辑过去两年,生成型AI的热潮席卷了商业世界。这项技术可以提高业务流程的执行效率,减少等待时间,降低过程缺陷。像ChatGPT这样的接口使得与大型语言模型(LLM)的互…

C# WEB API windows server 发布注意事项

1、使用背景: 数据请求方通过接口获取数据,同时使用方通过用户名称进行功能限制;2、实现方法: C# web服务功能,不同机型使用不同接口进行数据获取,请求数据需要包含产品条码信息、请求方用户名信息; 接口请求如下: 3、部署注意事项: 在windows server IIS 管理器中添…

菜单权限的设计与实现

说明该文章是属于OverallAuth2.0系列文章,每周更新一篇该系列文章(从0到1完成系统开发)。该系统文章,我会尽量说的非常详细,做到不管新手、老手都能看懂。说明:OverallAuth2.0 是一个简单、易懂、功能强大的权限+可视化流程管理系统。 友情提醒:本篇文章是属于系列文章,…

第十一章 成本管理(2025年详细解析版)

目录导语章节介绍什么是成本管理?关注两类成本11.1 管理基础项目成本管理的作用和意义项目成本失控原因(了解)成本类型机会成本沉没成本发展趋势和新兴实践如何计算进度偏差?11.2 项目成本管理过程过程概述项目成本管理过程裁剪时需要考虑的因素(不重要)在敏捷或适应型环…

寒假

今天继续学习Android Studio,今天学习的基础空间Button和EditText两个组件,了解了它们的属性,设计了一个简单的登录页面尝试获取前端的输入的信息,目前还未成功,经过学习,觉得融会贯通,目前认为,xml对应javaweb中的前端html页面,activity对应javaweb中的后端中的Contr…

操作系统课程设计:模拟进程调度

对 N 个进程应用模拟五种不同的进程调度算法,包括先来先服务(FCFS)、短进程优先(SJF)、时间片轮转(RR)、高响应比优先(HRRN)、动态优先级调度(PR)。2024年末《操作系统》课程设计大作业 模拟进程调度 对 N 个进程应用模拟五种不同的进程调度算法,包括先来先服务(F…