Python 魔术方法 详解

1、特殊属性

在这里插入图片描述

2、查看属性

  • __dir__ 返回类或者对象的所有成员名称列表

  • dir()函数操作实例就是调用__dir__()

  • 如果dir([obj])参数obj包含方法__dir__(),该方法将被调用

  • 如果参数obj不包含__dir__(),该方法将最大限度地收集属性信息

  • dir(obj) 对于不同类型的对象obj具有不同的行为:

    1 如果对象是模块对象,返回的列表包含模块的属性名和变量名

    2 如果对象是类型或者说是类对象,返回的列表包含类的属性名,及它的祖先类的属性名

    3 如果是类的实例
    __dir__方法,返回可迭代对象的返回值
    没有 __dir__方法,则尽可能收集实例的属性名、类的属性和祖先类的属性名

    4 如果obj不写,返回列表包含内容不同
    在模块中,返回模块的属性和变量名
    在函数中,返回本地作用域的变量名
    在方法中,返回本地作用域的变量名

  • locals() 返回当前作用域中的变量字典

  • globals() 当前模块全局变量的字典

2.1 示例 1

class Animal:
    x = 123
    def __init__(self, name):
        self._name = name
        self.__age = 10
        self.weight = 20
dir(Animal) 
['__class__',
 '__delattr__',
 '__dict__',
 '__dir__',
 '__doc__',
 '__eq__',
 '__format__',
 '__ge__',
 '__getattribute__',
 '__gt__',
 '__hash__',
 '__init__',
 '__init_subclass__',
 '__le__',
 '__lt__',
 '__module__',
 '__ne__',
 '__new__',
 '__reduce__',
 '__reduce_ex__',
 '__repr__',
 '__setattr__',
 '__sizeof__',
 '__str__',
 '__subclasshook__',
 '__weakref__',
 'x']
dir(Animal('Sybil'))
['_Animal__age',
 '__class__',
 '__delattr__',
 '__dict__',
 '__dir__',
 '__doc__',
 '__eq__',
 '__format__',
 '__ge__',
 '__getattribute__',
 '__gt__',
 '__hash__',
 '__init__',
 '__init_subclass__',
 '__le__',
 '__lt__',
 '__module__',
 '__ne__',
 '__new__',
 '__reduce__',
 '__reduce_ex__',
 '__repr__',
 '__setattr__',
 '__sizeof__',
 '__str__',
 '__subclasshook__',
 '__weakref__',
 '_name',
 'weight',
 'x']
class Cat(Animal): 
    y = 'abc'

dir(Cat)
['__class__',
 '__delattr__',
 '__dict__',
 '__dir__',
 '__doc__',
 '__eq__',
 '__format__',
 '__ge__',
 '__getattribute__',
 '__gt__',
 '__hash__',
 '__init__',
 '__init_subclass__',
 '__le__',
 '__lt__',
 '__module__',
 '__ne__',
 '__new__',
 '__reduce__',
 '__reduce_ex__',
 '__repr__',
 '__setattr__',
 '__sizeof__',
 '__str__',
 '__subclasshook__',
 '__weakref__',
 'x',
 'y']

3、魔术方法

3.1 实例化 __new__

  • 1 实例化一个对象;构造实例的时候,先调用__new__方法;返回的是一个实例,然后继续调用__init__方法,进行出厂配置
  • 2 该方法需要返回一个值,如果该值不是cls的实例,则不会调用__init__
  • 3 该方法永远都是静态方法,第一个参数cls需要手动输入,不会自动注入任何参数
  • 4 __init__方法很少使用,即使创建了该方法,也会使用return super().__new__(cls)基类object__new__方法来创建实例并返回
class A:
    def __new__(cls, *args, **kwargs):
        print('new')
        print(cls)
        print(args)
        print(kwargs)
        return super().__new__(cls)
        # return None
    
    def __init__(self, name):
        print('init')
        self.name = name
        
a = A('name')
new
<class '__main__.A'>
('name',)
{
   }
init

3.2 可视化

  • __str__:str() format() print()函数调用,需要返回对象的字符串表达。如果没有定义,就去调用__repr__方法返回字符串表达。如果__repr__没有定义,就直接返回对象的内存地址
  • __repr__:内建函数repr()对一个对象获取字符串表达。如果__repr__没有定义,就直接返回对象的内存地址
  • __bytes__:bytes()函数调用,返回一个对象的bytes表达,即返回bytes对象
  • 注意不能通过判断是否带引号来判断输出值的类型,类型判断要使用type或者isinstance
  • 直接作用对象 调用 str,但是间接作用也可以使用 str
  • 间接作用 优先调用 repr 例如:[] ()
  • 如果没定义repr,就会调基类的repr
  • 不能根据打印形式来判断数据类型,打印出来的全是给人看的,并不用真实数据类型
class A:
    def __init__(self
  • 12
    点赞
  • 89
    收藏
    觉得还不错? 一键收藏
  • 2
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值