1.__new__ 与 __init__
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__()
方法是在类准备将自身实例化时调用。
__new__()
方法始终都是类的静态方法,即使没有被加上静态方法装饰器。
Python 默认是调用该类的直接父类的 __new__()
方法来构造该类的实例,如果该类的父类也没有重写 __new__()
,那么将一直按此规矩追溯至 object 的 __new__()
方法,因为 object 是所有新式类的基类。
作用:
实例化当前类并返回此实例对象
__init__:
特性:
第一个参数是当前类实例
作用:
初始化方法 -》初始化类实例
实例化过程
class Myclass(object):def __init__(self, x):self.x = xc1 = 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年了你还不了解新式类与经典类? - 掘金
单例 -- 体现实例化在__new__中
class Singleton(object):_instance = Nonedef __new__(cls, *args, **kwargs):if cls._instance is None:cls._instance = object.__new__(cls, *args, **kwargs)return cls._instances1 = Singleton()
s2 = Singleton()
print(s1)
print(s2)
2.类中方法分类
*实例方法:在类中定义的方法通常默认都是实例方法,包括构造方法。
实例方法最大的特点就是,它最少也要包含一个 self 参数,用于绑定调用此方法的实例对象(Python 会自动完成绑定)。实例方法通常会用类对象直接调用
**类方法:至少要有一个形式参数,通常命名为 cls
,Python 会自动将类本身(注意:不是类对象)绑定给 cls 参数,无需显式为 cls 传参;并且类方法需要用 @classmethod
修饰符进行修饰。
类方法推荐使用类名直接调用,当然也可以使用实例对象来调用(不推荐)。
*静态方法:静态方法需要使用 @staticmethod
修饰符进行修饰。
调用:即可以使用类名,也可以使用实例对象
3.类属性
*类体中、所有函数之外:此范围定义的变量,称为类属性或类变量;
*类体中,所有函数内部:以“self.变量名”的方式定义的变量,称为实例属性或实例变量;
*类体中,所有函数内部:以“变量名=变量值”的方式定义的变量,称为局部变量。
4.内部类
class MyOuter:age=18def __init__(self,name):self.name=nameclass MyInner:def __init__(self,inner_name):self.inner_name=inner_nameout=MyOuter('lqz')
inner=out.MyInner('lqz_inner')
print(inner.inner_name)
https://www.cnblogs.com/liuqingzheng/p/9504210.html
5.参考:
python 类的实例化的全过程 — A/B
https://www.cnblogs.com/111testing/p/13660863.html
Python实例方法、静态方法和类方法详解(包含区别和用法)
https://www.cnblogs.com/liuqingzheng/p/9504210.html