python 类中一定需要有 __init__方法么?

在回答这个问题之前,先说两个问题:
① 面向对象编程?

② 什么是类?

面向对象,先上一个正式点的解释:

“把一组数据结构和处理它们的方法组成对象(object),把相同行为的对象归纳为类(class),通过类的封装(encapsulation)隐藏内部细节,通过继承(inheritance)实现类的特化(specialization)和泛化(generalization),通过多态(polymorphism)实现基于对象类型的动态分派。”

感觉看的云里雾里的。。。。

接下来看看通俗易懂的,面向对象是相对于面向过程而提出的程序设计思想,面向对象的三大特征:封装、继承、多态。
在这里插入图片描述编辑
再来看一个有趣的例子,来自知乎

不要被标题迷惑,写的挺贴切,客观的,每种方法都有利有弊,致胜的法宝永远都是实际情况实际分析。文中虽然没用python做例子,但是本质和原理的东西是不变的,与用什么语言无关。
在这里插入图片描述编辑

说明: 以上的内容来自于网络,不代表作者本人的观点和看法,与作者本人立场无关,相关责任不由作者承担。

什么是–类?

类是对现实事物的抽象,例如人类,人有男人、女人,但概念还是太大,需要继续抽象,思考一下人(不论男女)正常情况都有什么特征,例如名字、性别等固定的特征,一般用名词来限定(属性),有什么行为,例如人会吃饭、看电影、上厕所等行为(方法),一般用动词来描述,我们将属性和方法给抽象出来(一定是普遍的,共有的,非特指或小范围的),就构成了人类这个"类"(Class)。

现在来回答开始时提出的问题:python 类中一定需要有 __init __方法么?没有的会怎样?

我们已经知道了,类是由属性和方法构成的,python类中用__init__方法(也可理解为初始化方法)来定义属性,在实例化一个对象时,会先调用__init__方法,将这个类所具有的相关属性赋予这个对象,然后我们通过这个对象,就可以直接访问他所具有的属性。

还是人类这个例子,看下面的代码:

class Person():

#定义一个类

def __init__(self,name,gender):

#人有名字

self.name = name

#人有性别

self.gender = gender

def eat(self):

#人需要吃饭,所以定义一个吃饭的方法

print("%s正在吃饭,有啥事吃完再说。。。"% self.name)

def watch_movie(self,movie_name):

#还需要娱乐,所以定义可以看电影的方法

print("{}正在看{},这部电影!".format(self.name, movie_name))

def go_wc(self):

#人还需要上厕所,不然憋死了,所以定义一个上厕所的方法

if self.gender == "男":

#男的上男厕所,进错了就是耍流氓,女的就是进错了。。。哈哈公平何在

print("{}要进{}厕所。。。不然就是耍流

氓".format(self.name,self.gender) )

if self.gender == "女":

print("{}要进{}厕所。。。不然就是走错

了".format(self.name,self.gender))


if __name__ == "__main__":

#实例化一个人

person1 = Person("小明","男")

#查看这个人的名字

print(person1.name)

#查看这个人的性别

print(person1.gender)

#调用吃饭这个方法,确保不被饿死

person1.eat()

#吃完可以看看电影

person1.watch_movie("色即是空")

#看电影过程中可能需要上厕所

person1.go_wc()


  1.     

在这里插入图片描述编辑


再看一下下面的代码:

class Person():

#定义一个人类

#没有__init__方法,直接定义行为(方法)

def eat(self,name):

#人需要吃饭,所以定义一个吃饭的方法

print("%s正在吃饭,有啥事吃完再说。。。"%name)

def watch_movie(self,name, movie_name):

#看电影

print("{}正在看{},这部电影!".format(name, movie_name))

def go_wc(self, name,gender):

#上厕所

if gender == "男":

print("{}要进{}厕所。。。不然就是耍流氓".format(name,gender))

if gender == "女":

print("{}要进{}厕所。。。不然就是走错了".format(name,gender))


if __name__ == "__main__":

#实例化一个人,貌似其他动物也有这些行为,例如二哈,不一定是人啊

person1 = Person()

#print(person1.name) 没有名字属性,调用报错

#print(person1.gender) 没有性别属性,调用报错

#吃饭

person1.eat("小红")

#看电影

person1.watch_movie("小红","红楼梦")

#上厕所

person1.go_wc("小红","女")

在这里插入图片描述编辑
这个修改版本中去掉了__init__方法,这导致这个类没有name和gender属性,如果执行print(self.name)或者print(self.gender)就会报错,而且在调用吃饭,看电影、上厕所这些方法时需要传入过多的重复参数增加了代码的冗余。如果不事先知道是定义了一个“人”类,在没有相关属性的前提前提下不便于确定这个class是什么,毕竟其他动物也会吃饭,也可以看电影(二哈)。。。虽说去掉__init__对于定义这个类并不会报错,但为了便于使用和理解应当定义__init__方法。想一想现实生活中什么东西没有属性(不可用语言描述),但是却有行为。。。怎么感觉怪怪的。。。。

#Python#
Python 文章被收录于专栏

Python由荷兰数学和计算机科学研究学会的吉多·范罗苏姆于1990年代初设计,作为一门叫做ABC语言的替代品。Python提供了高效的高级数据结构,还能简单有效地面向对象编程。Python语法和动态类型,以及解释型语言的本质,使它成为多数平台上写脚本和快速开发应用的编程语言,随着版本的不断更新和语言新功能的添加,逐渐被用于独立的、大型项目的开发

全部评论
这样一说一下子明白了什么是面向对象
点赞 回复 分享
发布于 2022-08-27 16:58 陕西

相关推荐

求offer的大角牛:不吃香菜
点赞 评论 收藏
分享
评论
点赞
5
分享

创作者周榜

更多
牛客网
牛客网在线编程
牛客网题解
牛客企业服务