class Person: def __init__(self, pro): """ :param pro: 专业 """ self.pro = pro print("------__init__------函数的执行") pass def eat(a, name, food): """ 实例方法 :param name:姓名 :param food:食物 :return: """ a.name = name a.food = food print("%s喜欢吃%s,是%s专业" % (name, food, a.pro)) # print("%s喜欢吃%s,是%s专业"%(name, food, self.pro)) 必须是该实例方法的self位置的名称(即实例变量) pass def __str__(self): """ 打印对象,自定义对象,是内容格式的 :return: """ return "%s 喜欢吃 %s,修的专业是%s" % (self.name, self.food, self.pro) pass def __new__(cls, *args, **kwargs): """ 创建对象实例的方法 每调用一次 生成一个新的对象 :param args: :param kwargs: """ print("-----------__new__---------函数的执行") return object.__new__(cls) pass pass
xw = Person("工程师") xw.eat("小王", "榴莲") print(xw) # 没有__str__(self)输出的是地址,有的话输出的是__str__(self)返回的字符
运用__new__时需要注意,最后返回object.__new__(cls),而不是引用的类中的函数名
- __new__至少要有一个参数cls,代表要实例化的类,此参数在实例化时由Python解释器自动提供
- __new__必须要有返回值,返回实例化出来的实例,这点在自己实现__new__时要特别注意,可以return父类__new__出来的实例,或者直接是object的__new__出来的实例
- __init__有一个参数self,就是这个__new__返回的实例,__init__在__new__的基础上可以完成一些其它初始化的动作,__init__不需要返回值