2025-01-21 12:06阅读: 3评论: 0推荐: 0

python中针对类本身的方法

当你提到 __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 = value
    def __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:
    pass
    obj = MyClass()
    print(obj.__class__) # 输出: <class '__main__.MyClass'>

3. __mro__ (Method Resolution Order)

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

4. __dict__

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

5. __name__

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

6. __base__

  • 作用:获取当前类的父类(基类)。如果没有父类则返回 object
  • 用法self.__class__.__base__ 返回父类。
  • 示例
    class A:
    pass
    class B(A):
    pass
    obj = 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 = name
    def __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 * 2
    obj = 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 属性

总结

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

本文作者:清澈的澈

本文链接:https://www.cnblogs.com/lmc7/p/18683392

版权声明:本作品采用知识共享署名-非商业性使用-禁止演绎 2.5 中国大陆许可协议进行许可。

posted @   清澈的澈  阅读(3)  评论(0编辑  收藏  举报
评论
收藏
关注
推荐
深色
回顶
收起
点击右上角即可分享
微信分享提示