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 属性
    

总结

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

posted @ 2025-01-21 12:06  清澈的澈  阅读(29)  评论(0)    收藏  举报