python面向对象编程——__new__()、__getitem__()、__call__()与callable()、__doc__与__dict__

19. __ new __

当使用“类名”([实参])创建实例对象时,Python解释器的主要处理过程包括两大类:

  1. 调用特殊方法__new__()创建实例对象
    首先会查找该类对象是否实现了此特殊方法,如果没有实现,则去其父类中以此查找。直到类对象object
  2. 调用特殊方法__init__()对创建的实例对象进行初始化
    __ new __ ()返回的实例对象会作为实参被自动传递给__init__()的第一个形参self
class Parent(object):
   def __new__(cls, *arg, **kwargs): 
       print("父类的__new__被调用,其形参cls对应的id:",id(cls))
       obj = super().__new__(cls)
       print("创建的实例对象的id:",id(obj))
       return obj
class Child(Parent):
   def __init__(self, name):
   #__new__返回的obj会作为实参传递给__init__的第一个形参self
       print("子类的__init__()被调用,其形参self对应的id:",id(self))
       self.name = name
child = Child("Mike")

父类的__new__被调用,其形参cls对应的id: 68401464
创建的实例对象的id: 95546840
子类的__init__()被调用,其形参self对应的id: 95546840

20. getitem()、setitem()、delitem()

自定义类对象的实例对象,在默认情况下,是不能像列表和字典那样使用中括号语法来操作数据

如果想让自定义类对象的实例对象可以像列表和字典那样,使用中括号语法来操作数据,必须在自定义类对象中实现以下特殊方法:

1. getitem(self,key)

当执行操作obj[key]时,会自动调用该特殊方法获取数据

2. setitem(self,key,value)

当执行操作obj[key] = value时,会自动调用该特殊方法设立数据

3. delitem(self,key)

当执行操作del obj[key]时,会自动调用该特殊方法删除数据

class MyDict(object):
    def __init__(self):
        self.data = {}
    #必须定义下列三种特殊方法 不然会报错
    def __getitem__(self, key):
        return self.data[key]
    def __setitem__(self, key, value):
        self.data[key] = value
    def __delitem__(self, key):
        del self.data[key]        
md = MyDict()
md["one"] = 18
md["two"] = 32
print(md.data)

{'one': 18, 'two': 32}
del md["two"]
print(md.data)

{'one': 18}
md['one']

18

21. __ call __ 与 callable

1. __ call__

若在类对象中实现了特殊方法__call__(),那么就可以像调用函数一样直接调用这个类对象的实例对象,从而会自动调用特殊方法__call__()

class MyClass(object):
    def __call__(self, age, *args, **kwargs):
        print(args, kwargs)
mc = MyClass()
# 10占据了age参数,返回元组和字典
#参考博客链接 (函数的参数传递):https://mp.csdn.net/mdeditor/89349712#

mc(10, 2, 6, 8, name = 'Tom', hobby = 'music')

(2, 6, 8) {'name': 'Tom', 'hobby': 'music'}

2. callable:

内置函数callable用于判断指定对象是否可调用

除了函数对象是可调用的之外,对于实现了特殊方法__call__()的类对象,其实例对象也是可调用的

#内置函数可调用
callable(print)
True
#自定义函数可调用
def fun():
    pass
callable(fun)

True
#自定义实现特殊方法__ call __类对象的实例对象可调用
callable(MyClass())
True

22. __ doc __ 与__ dict __

1. __ doc __用于表示类对象的文档字符串

  1. 类对象的文档字符串
    与函数的文档字符串类似,位于类对象的第一行的字符串被称为类对象的文档字符串,通常用三个引号表示,类对象的文档字符串是对类对象的功能的简要描述
class MyClass(object):
    """
    这是类对象的文档字符串
    aa bb cc
    """
    pass
  1. 访问类对象的文档字符串
    通过类对象的特殊属性__doc__可以访问类对象文档字符串

print(MyClass.__doc__)

这是类对象的文档字符串
aa bb cc    

调用内置函数help()得到帮助类函数的文档字符串
help(MyClass)

Help on MyClass in module __main__ object:

class MyClass(builtins.object)
 |  这是类对象的文档字符串
 |  aa bb cc
 |  
 |  Data descriptors defined here:
 |  
 |  __dict__
 |      dictionary for instance variables (if defined)
 |  
 |  __weakref__
 |      list of weak references to the object (if defined)

2. __ dict __

对于指定的类对象或实例对象,通过访问特殊方法__dict__可以获得该类对象或实例对象绑定的所有方法和属性的字典。其中字典的键为方法名或属性名

class MyClass(object):
    ca = 'ca'
    def __init__(self):
        self.ia = 'ia'
    def im(self):
        pass
    @classmethod
    def cm(cls):
        pass
    @staticmethod
    def sm():
        pass
        
#访问类对象所绑定的所有属性和方法
MyClass()
MyClass.ca2 = 'ca2'
MyClass.__dict__
mappingproxy({'__dict__': <attribute '__dict__' of 'MyClass' objects>,
              '__doc__': None,
              '__init__': <function __main__.MyClass.__init__>,
              '__module__': '__main__',
              '__weakref__': <attribute '__weakref__' of 'MyClass' objects>,
              'ca': 'ca',
              'ca2': 'ca2',
              'cm': <classmethod at 0x5bc60f0>,
              'im': <function __main__.MyClass.im>,
              'sm': <staticmethod at 0x5bc6128>})
#绑定实例对象
mc = MyClass()
mc.ia2 = 'ia2'
print(mc.__dict__)

{'ia': 'ia', 'ia2': 'ia2'}

  • 1
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值