类的特殊成员方法

来源:互联网 发布:手机gif修改软件 编辑:程序博客网 时间:2024/05/17 01:46
# 类的特殊成员方法import sysclass Cat(object):    '''这个类是描述喵这个对象的'''    def __init__(self, name, age):        self.name = name        self.age = age    def __call__(self, *args, **kwargs):        print("run call", args, kwargs)    # def __str__(self):    #     print("__str__ contents")print(Cat.__doc__)  #打印这个类的描述信息c = Cat(1, 2)print(c.__module__)  #输出模块print(c.__class__)  #输出类# __init__  #构造方法:创建对象时触发# __del__  #析构方法# __call__  #由对象后加()触发c(1, 2, 3, name="sa")  #run callCat(1, 2)(1, 2, 3, name="sa")#__dict__  #查看类或者对象的所有成员print(Cat.__dict__)  #以一个字典形式把类中的属性方法都打印出来print(c.__dict__)  #通过实例调用值打印实例变量#__str__  #如果一个类中定义了__str__方法 那么打印对象时 默认输出该方法的返回值 否者返回的是一个内存地址print(c)#__getitem__ __setitem__ delitem__   #把实例搞成一个字典class Fooo(object):    def __init__(self):        self.data = {}    def __getitem__(self, item):        print("getitem", item)        return self.data.get(item)    def __setitem__(self, key, value):        print("setitem", key, value)        self.data[key] = value    def __delitem__(self, key):        print("delitem", key)f = Fooo()f["name"] = "嗷巴马"print(f["name"])del f["name"]# 类是由type实例化创建的print(type(f))print(type(Fooo))#创建类的两种方式 普通 -> 特殊def func(self):    print("hello world %s" %self.name)def __init__(self, name, age):    self.name = name    self.age = ageFoo = type("Foo", (object,), {"talk":func, "__init__":__init__})  #key __init__ 不能乱写ff =Foo('无图以对', 2)# type第一个参数:类名# type第二个参数:当前类的基类# type第三个参数:类的成员 key->valueprint(type(Foo))print(ff)ff.talk()#__new__ \ __metaclass__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)        self.__init__(obj)class Man(object):    __metaclass__ = MyType #原类:定义你的类如何被创建    def __init__(self, name, age):        print("__init__")        self.name = name        self.age = age    def __new__(cls, *args, **kwargs):        print("__new__")        return object.__new__(cls) #此处是把Man传进去了 相当于去继承父类的new方法 必须returnm = Man("Ass", 22)print(m) # new先于init执行 new是用户来创建实例的 new 中不return对象 类就无法实例化        #call创建new  new创建init