python(57): 类与实例化

发布时间:2024年01月21日

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 = 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年了你还不了解新式类与经典类? - 掘金

单例 -- 体现实例化在__new__中

 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) 

2.类中方法分类

*实例方法:在类中定义的方法通常默认都是实例方法,包括构造方法。

实例方法最大的特点就是,它最少也要包含一个 self 参数,用于绑定调用此方法的实例对象(Python 会自动完成绑定)。实例方法通常会用类对象直接调用

**类方法:至少要有一个形式参数,通常命名为?cls,Python 会自动将类本身(注意:不是类对象)绑定给 cls 参数,无需显式为 cls 传参;并且类方法需要用?@classmethod?修饰符进行修饰。

类方法推荐使用类名直接调用,当然也可以使用实例对象来调用(不推荐)。

*静态方法:静态方法需要使用?@staticmethod?修饰符进行修饰。

调用:即可以使用类名,也可以使用实例对象

3.类属性

*类体中、所有函数之外:此范围定义的变量,称为类属性或类变量;

*类体中,所有函数内部:以“self.变量名”的方式定义的变量,称为实例属性或实例变量;

*类体中,所有函数内部:以“变量名=变量值”的方式定义的变量,称为局部变量。

4.内部类

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

5.参考:

python 类的实例化的全过程 — A/B

https://www.cnblogs.com/111testing/p/13660863.html

?Python实例方法、静态方法和类方法详解(包含区别和用法)

https://www.cnblogs.com/liuqingzheng/p/9504210.html

文章来源:https://blog.csdn.net/qq_37674086/article/details/135658023
本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。