编程经历的几个阶段:从最开始的需要什么数据和功能,就直接写。到函数,将功能写到一起。但是和数据还是分开的,数据和功能并没有很强的耦合性,都是一个个独立的个体。所以演变到面向对象,面向对象的思想是将数据和功能整合到一起。
将数据和功能整合到一起的方式有很多,只要将数据和功能整合到一起,就属于面向对象的范畴。如:将数据和功能放在一个文件中,使用的时候,导入这个文件。甚至将数据和功能放在列表/字典中。只要实现了将数据和功能放在一起,那么就可以说是面向对象。
面向对象指的是一种编程思想,不仅仅指的是某种语法。语法是一个语言特有的,不通语言,其语法不尽相同,而编程思想是所以语言都通用的。
没有类之前,对象指的仅是容器类型,如一个py文件,列表等,存放的是数据和功能,不过同类的数据和功能可能需要不断重复的定义,而类的出现,打破了这一现状,类将同类型的对象中相似的功能和数据提取了出来,单独创建了一个对象,也就是类。作为创建对象的基石,类也是一种对象,不过这个对象不再是包含某一些数据和功能,而是包含了同种类型的所有数据和功能,作为基础。通过调用类,来产生对象,在对这个对象做操作。是思想上的逆转。本来定义对象,就是按照常规的操作,定义函数和变量这样,但是类的出现,逆转了这一思路,先定义一个通用的类,然后通过调用相应的类来产生对象,然后再对其进行个性化的操作。
如果对python有了整体的了解后,官方文档的解释更准确:官方文档地址(中文)
__new__():调用这个方法来创建一个类的实例。是一个静态方法,且是一个特例,所以不需要显式地声明,它会将所请求的类作为第一个参数,其他参数传递给构造器(__init__()),__new__()的返回值通常是新对象的实例
如果返回值是这个类的实例,那么实例的__init__()就会在之后执行
如果返回值不是这个类的实例,或随便返回了一个值,那么即使实例中有__init__(),也不会执行
__new__()的目的主要是允许不可变类型的子类(如int str或tuple)定制实例创建过程。也常用在自定义元类中被重载以便定制类创建过程(drf中序列化器的mant=True源码中有使用)
构造器
__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__():在实例将被销毁时调用
根据面向对象的思想,对象就是数据和功能的整合体,所以定义对象可以这样写
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?') # # 修改属性和之前一样