Python_new方法详解

1、getitem等:

# Author : XueFeng

class Foo(object):
    def __init__(self):
        self.data = {}

    def __getitem__(self, key):
        print("__getitem__", key)
        self.data.get(key)

    def __setitem__(self, key, value):
        print("__setitem__", key, value)
        self.data["key"] = value

    def __delitem__(self, key):
        print("__delitem__", key)

f = Foo()
a = f["name"]           # 自动触发执行 __getitem__
f["name"] = "jim"       # 自动触发执行 __setitem__
del f["name"]

2、__new__方法:

# Author : Xuefeng

# class Foo(object):
#     def __init__(self, name):
#         self.Name = name
#
# f = Foo("Jim")
# print(type(f))
# print(type(Foo))    # Foo类的类是type
#
# def func(self):
#     print("Hello %s" % self.name)
# def __init__(self, name, age):
#     self.name = name
#     self.age = age
#
# Poo = type("Poo", (object,), {"talk": func,
#                               "__init__": __init__})        # 第一个参数:类名   第二个参数:基类  第三个参数:类的成员
# p = Poo("Tom", 18)
# p.talk()
# print(p.__dict__)
# print(type(Poo))


# 类默认是由type实例化产生的,type类中如何实现的创建类?类又是如何创建对象?
# 答:类中有一个属性__metaclass__, 其用来表示该类由谁来实例化创建,所以我们可以为
# __metaclass__设置一个type的派生类,从而查看类创建的过程

class Mytype(type):
    def __init__(self, what, bases=None, dict=None):
        super(Mytype,self).__init__(what, bases, dict)

    def __call__(self, *args, **kwargs):
        obj = self.__new__(self, *args, **kwargs)       # 第二阶段,由Mytype的call方法调用Foo的new
        self.__init__(obj, *args, **kwargs)             # 第三阶段,执行Foo的init

class Foo(object):
    __metaclass__ = Mytype                              # 第一阶段,执行Mytype的init
    def __init__(self, name):
        self.name = name
        print("Foo ---init")

    def __new__(cls, *args, **kwargs):      # new 是用来创建实例的
        print("Foo ---new")
        # print(object.__new__(cls))
        return object.__new__(cls)          # 继承父类的new方法

f = Foo('Jim')
print(f.name)


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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值