面向对象编程 >(5)

一、__new__

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

1.调用特殊方法__new__()创建对象。
首先会查找对象是否实践了书方法__new__(),若没有实践,则去其父类中依次查找,直到哦到类对象object。

2.调用特殊方法__init__()对你的实例对象进行初始化。
new()返回的实例对象会作为实参被自动传递给__init__()的第一个形参self。

class Parent(object):
    def __new__(cls, *args, **kwargs):
        pass
    
class Child(Parent):
    def __init__(self, name):
        pass
--------------------------------------------------------------
>>>id(Parent)
2298179254808

>>>id(Child)
2298179238760
----------------------------------------------------------------
class Parent(object):
    def __new__(cls,*args,**kwargs):
        print("父类的__new__()被调用,其形参cls对应实参的id",id(cls))
        obj = super().__new__(cls)
        print("创建的实例对象的id",id(obj))
        return obj
class Child(Parent):
    def __init__(self,name):
         print("子类的__new__()被调用,其形参cls对应实参的id",id(self))
         self.name = name
 -------------------------------------------------------------------------
 >>>print("父类Parent的id:",id(Parent))
 父类Parent的id: 2298179230264

>>>print("子类Child的id:",id(Child))
子类Child的id: 2298179257640

>>>print("创建的实例对象的id:",id(child))
创建的实例对象的id: 2298200306296
二、__gettitem__(self,key)、__setitem__(key)、__delitem(self, key)

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

1.gettitem(self, key)
2.setitem(key)
3.__delitem(self, key)
class MyDict(object):
    def __init__(self):
        self.data = {}
        
    def __gettitem__(selg, key):
        return self.data[key]
    
    def __setitem__(self, key, value):
        self.data[key] = value
        
    def __delitem__(self, key):
        self.data[key]
        
md = MyDict()
------------------------------------------------------------
>>>md["one"] = 18
>>>md["two"] = 32
>>>print(md.data)
{'one': 18, 'two': 32}
三、__call__()

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

class MyClass(object):
    def __call__(self, *args, **kwargs):
        print(args, kwargs)
        
mc = MyClass()
mc()
-------------结果--------------------------------
() {}
-----------------
>>>mc(1, 2, x = 3, y = 4)
(1, 2) {'x': 3, 'y': 4}

PS:
1、内置函数callable用于判断ing对是否可调用的。
2、除了函数对象是可调用的之外,对于实现了书方法__call__()的类对象,其实例对象也是可调用的。

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值