class Test(object):
def __init__(self, *args, **kwargs): #第一个参数是当前类实例
print("in init...")
def __new__(cls, *args, **kwargs):
print("in new...")
return object.__new__(cls, *args, **kwargs) #第一个参数当前类
test = Test()
特性:
__new__()
?方法是在类准备将自身实例化时调用。
__new__()
?方法始终都是类的静态方法,即使没有被加上静态方法装饰器。
Python 默认是调用该类的直接父类的?__new__()
?方法来构造该类的实例,如果该类的父类也没有重写?__new__()
,那么将一直按此规矩追溯至 object 的?__new__()
?方法,因为 object 是所有新式类的基类。
作用:
实例化当前类并返回此实例对象
特性:
第一个参数是当前类实例
作用:
初始化方法 -》初始化类实例
class Myclass(object):
def __init__(self, x):
self.x = x
c1 = Myclass(11) #相当于隐式执行了__new__()和__init()
c2 = Myclass.__new__(Myclass, 12) #显式调用__new__(),返回c2对象
c2.__init__( 12) #显示调用__init(),完成c2的初始化
print c1.x, c2.x输出: 11 12
__new__
?是先实例化一个对象,?__init__
?是初始化一个对象,中间会自动调用。
新式类开始实例化时,__new__() 方法会返回 cls(cls 指代当前类)的实例,然后该类的 __init__() 方法作为构造方法会接收这个实例(即self)作为自己的第一个参数,然后依次传入 __new__() 方法中接收的位置参数和命名参数。
注意:如果?__new__()
?没有返回 cls(即当前类)的实例,那么当前类的?__init__()
?方法是不会被调用的。如果?__new__()
?返回其他类(新式类或经典类均可)的实例,那么只会调用被返回的那个类的构造方法。
新式类与经典类:2021年了你还不了解新式类与经典类? - 掘金
class Singleton(object):
_instance = None
def __new__(cls, *args, **kwargs):
if cls._instance is None:
cls._instance = object.__new__(cls, *args, **kwargs)
return cls._instance
s1 = Singleton()
s2 = Singleton()
print(s1)
print(s2)
*实例方法:在类中定义的方法通常默认都是实例方法,包括构造方法。
实例方法最大的特点就是,它最少也要包含一个 self 参数,用于绑定调用此方法的实例对象(Python 会自动完成绑定)。实例方法通常会用类对象直接调用
**类方法:至少要有一个形式参数,通常命名为?cls
,Python 会自动将类本身(注意:不是类对象)绑定给 cls 参数,无需显式为 cls 传参;并且类方法需要用?@classmethod
?修饰符进行修饰。
类方法推荐使用类名直接调用,当然也可以使用实例对象来调用(不推荐)。
*静态方法:静态方法需要使用?@staticmethod
?修饰符进行修饰。
调用:即可以使用类名,也可以使用实例对象
*类体中、所有函数之外:此范围定义的变量,称为类属性或类变量;
*类体中,所有函数内部:以“self.变量名”的方式定义的变量,称为实例属性或实例变量;
*类体中,所有函数内部:以“变量名=变量值”的方式定义的变量,称为局部变量。
class MyOuter:
age=18
def __init__(self,name):
self.name=name
class MyInner:
def __init__(self,inner_name):
self.inner_name=inner_name
out=MyOuter('lqz')
inner=out.MyInner('lqz_inner')
print(inner.inner_name)
https://www.cnblogs.com/liuqingzheng/p/9504210.html
https://www.cnblogs.com/111testing/p/13660863.html