Python-内置的__xxx__()含义

面向对象的编程思想

  编程经历的几个阶段:从最开始的需要什么数据和功能,就直接写。到函数,将功能写到一起。但是和数据还是分开的,数据和功能并没有很强的耦合性,都是一个个独立的个体。所以演变到面向对象,面向对象的思想是将数据和功能整合到一起。

  将数据和功能整合到一起的方式有很多,只要将数据和功能整合到一起,就属于面向对象的范畴。如:将数据和功能放在一个文件中,使用的时候,导入这个文件。甚至将数据和功能放在列表/字典中。只要实现了将数据和功能放在一起,那么就可以说是面向对象。

  面向对象指的是一种编程思想,不仅仅指的是某种语法。语法是一个语言特有的,不通语言,其语法不尽相同,而编程思想是所以语言都通用的。

  没有类之前,对象指的仅是容器类型,如一个py文件,列表等,存放的是数据和功能,不过同类的数据和功能可能需要不断重复的定义,而类的出现,打破了这一现状,类将同类型的对象中相似的功能和数据提取了出来,单独创建了一个对象,也就是类。作为创建对象的基石,类也是一种对象,不过这个对象不再是包含某一些数据和功能,而是包含了同种类型的所有数据和功能,作为基础。通过调用类,来产生对象,在对这个对象做操作。是思想上的逆转。本来定义对象,就是按照常规的操作,定义函数和变量这样,但是类的出现,逆转了这一思路,先定义一个通用的类,然后通过调用相应的类来产生对象,然后再对其进行个性化的操作。

__xxx__()方法释义

如果对python有了整体的了解后,官方文档的解释更准确:官方文档地址(中文)

__new__()

__new__():调用这个方法来创建一个类的实例。是一个静态方法,且是一个特例,所以不需要显式地声明,它会将所请求的类作为第一个参数,其他参数传递给构造器(__init__()),__new__()的返回值通常是新对象的实例

如果返回值是这个类的实例,那么实例的__init__()就会在之后执行

如果返回值不是这个类的实例,或随便返回了一个值,那么即使实例中有__init__(),也不会执行

__new__()的目的主要是允许不可变类型的子类(如int str或tuple)定制实例创建过程。也常用在自定义元类中被重载以便定制类创建过程(drf中序列化器的mant=True源码中有使用)

__init__()

构造器

__init__():在实例 通过__new__() 被创建之后,返回调用者之前调用。其参数与传递给类构造器表达式的参数相同。一个基类如果有__init__方法,则其所派生的类如果也有__init__方法,就必须显式地调用它以确保实例基类部分的正确初始化;例如: super().__init__([args...]).

 

因为对象是由 __new__() 和__init__ 协作构造完成的 (由 __new__() 创建,并由 __init__定制),所以 __init__ 返回的值只能是 None,否则会在运行时引发TypeError

即:

1、__init__()是在__new__()之后执行的

2、传递给__new__()的参数和传递给__new__()一样

3、若父类有__init__方法,子类也有__init__(),那么子类就必须调用父类的__init__(),在子类的__init__()里面调用

4、__init__()返回值必须是None(不写return也是返回None)

 

__del__()

__del__():在实例将被销毁时调用

__init__()的演变过程

根据面向对象的思想,对象就是数据和功能的整合体,所以定义对象可以这样写


class Book:
name = 'are you ok?' # 定义一个类属性
comment = 'nong sa lei'

def func(self): # 定义一个类方法
print('what are you doing?')

print('i am fine, thank you!') # 执行就打印,类体代码是在定义时执行的

# 实例化对象
book_1 = Book()
book_2 = Book()

# 修改对象属性
book_1.name = 'enheng?'
book_2.name = 'nongsalei?'

这样就产生了一个问题,代码的重复度很高,所以可以把相同代码写成一个初始化对象的函数的方式来简化代码

# 通过函数来简化代码
def init(obj, name, comment): # 传入对象和参数
obj.name = name
obj.price = comment
return obj # 将初始化的对象返回

这样写,是可以的,不过和类的关联性较低,关联性不大,所以可以直接将这个函数写到类中,然后实例化对象的时候去调用它

同时,python也支持这一写法,所以推出了__init__()内置方法,在实例化对象的时候,自动初始化,无需手动调用

# 通过__init__()的方式写一个类
class Book:
    def __init__(self, name, comment='n'):
        self.name = name
        self.comment = comment

    def func(self):
        print('what are you doing?')

    print('i am fine, thank you!')

# 这样实例化对象
book_1 = Book(name='are you ok?',comment='nong sa lei?') # 

# 修改属性和之前一样

 

上一篇:又一例存储cache丢失oracle数据库恢复---xifenfei


下一篇:kettle 用JIDN连接多数据库JOIN到同一张表