# 类的特殊成员方法
import sys
class 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 call
Cat(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 = age
Foo = type("Foo", (object,), {"talk":func, "__init__":__init__}) #key __init__ 不能乱写
ff =Foo('无图以对', 2)
# type第一个参数:类名
# type第二个参数:当前类的基类
# type第三个参数:类的成员 key->value
print(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方法 必须return
m = Man("Ass", 22)
print(m) # new先于init执行 new是用户来创建实例的 new 中不return对象 类就无法实例化
#call创建new new创建init
类的特殊成员方法
最新推荐文章于 2023-06-21 19:00:26 发布