用生动的例子花式解释:python类中一定需要有 __init__方法么?没有会怎样?

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 = genderdef 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()

在这里插入图片描述


再看一下下面的代码:

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__方法。想一想现实生活中什么东西没有属性(不可用语言描述),但是却有行为。。。怎么感觉怪怪的。。。。

转载链接:

https://blog.csdn.net/qq_30597401/article/details/108409239

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/439346.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

了解 SharePoint 2010 开发中的关键设计决定

在开发项目时,我们经常用到SVN.但是有时候,只知道把源码放到trunk , 把一些文档放到Document下面。其它的目录都应该放什么东西,应该怎么用。可能都有点模糊。 Branch 目录 : 跟工程项目相关的各个工程版本分支。该目录下面的版…

C++,string类的指针,string类数组的指针 string *s

可以这样&#xff1a; #include<iostream> #include<string> using namespace std;int main(void) {string s "hello";//定义一个char类型指针&#xff0c;把string s的首元素地址赋给pt,则pt指向字符串s.char *pt &s[0]; cout << pt <&…

了解 SharePoint 2010 开发中的关键点

**摘要&#xff1a;**了解为 Microsoft SharePoint 2010 规划和开发业务解决方案时必须做出的关键点。 上次修改时间&#xff1a; 2012年3月13日 适用范围&#xff1a; Business Connectivity Services | Office 2010 | Open XML | SharePoint Designer 2010 | SharePoint Fo…

C++自定义迭代器模板,实现ArrayList基本操作,自定义迭代器遍历

运用到的知识&#xff1a;&#xff08;不分先后&#xff09; 模板&#xff0c;类&#xff0c;循环数组&#xff0c;线性表&#xff0c;指针&#xff0c;异常&#xff0c;迭代器&#xff0c;输入输出等C基础 #include<iterator> #include<iostream> #include<v…

SharePoint2013 2019性能及限制

适用于&#xff1a;2013 2019 SharePoint Online 本文档介绍 SharePoint Server 2013 的软件边界和限制。其中包括&#xff1a; 边界&#xff1a; 根据设计无法超过的静态限制 阈值&#xff1a; 为满足特定要求而能够超过的可配置限制 支持的限制&#xff1a; 已默认设置为…

Anaconda安装绘图模块altair

pip install -i https://pypi.tuna.tsinghua.edu.cn/simple altair

MOSS/Sharepoint RBS概念以及运用

注&#xff1a;原文作者不知道是谁&#xff0c;先收藏了这篇&#xff08;若有侵权&#xff0c;请留言&#xff0c;删除&#xff09; EBS -> External Blob Storage 外部大二进制对象存储 RBS -> Remote Blob Storage 远程大二进制对象存储 这俩概念据我所知&#xff0c;…

【Python学习】 - 超详细的零基础Pandas学习(附Python数据分析与应用课本第四章实训答案)

&#xff08;博文体系参考&#xff1a;《Python数据分析与应用》课本&#xff09; 任务数据如下&#xff1a; 读入csv文件时&#xff0c;encoding必须是正确的&#xff0c;常用的编码格式有&#xff1a;UTF-8 , UTF-16 , GBK , GB2312 , GB18030等。 如果和文件的编码格式不符…

SQL Server 中“dbo”到底是什么

在&#xff33;&#xff31;&#xff2c; Server中看见很多表名都有前缀dbo&#xff0c;但是不写也可以。比如pubs的数据库中的表dbo.title &#xff11;&#xff0e; dbo是一个构架(schema)&#xff0c;在sql2005中,表的调用格式如下:"数据库名.构架名.表名",同一个…

win10,配置环境变量时系统环境变量和用户环境变量的优先级

关于%%中间夹着的东西&#xff0c;比如%AppData%的路径&#xff0c;是在注册表中可以修改的&#xff0c;用户也可以自定义这种%...%&#xff0c;相当于你定义了一个路径常量&#xff0c;定义方法也是去系统的环境变量中去添加即可。 比如一般常用%JAVAHOME%这种。 参考文章&a…

sql server登录名、服务器角色、数据库用户、数据库角色、架构区别联系**

1.一个数据库用户可以对应多个架构&#xff08;架构是表容器&#xff09;。架构里面包含的是数据库表。 2.一个数据库角色有可能涉及多个架构。数据库角色对应的是权限。 3.一个用户对应一个数据库角色。 4.登录名与数据库用户在服务器级别是一对多的&#xff1b;在数据库级…

python 字典、列表、字符串 之间的相互转换

1、列表与字符串转换 列表转字符串&#xff1a; 将列表中的内容拼接成一个字符串 将列表中的值转成字符串 字符串转列表&#xff1a; 用eval转换 将字符串每个字符转成列表中的值 将字符串按分割成列表 2、列表与字典转换 列表转字典&#xff1a; 将两个列表转成字典 将嵌…

【转】SharePoint开发中可能用到的各种Context(上下文)

第一部分 服务器端上下文 一、HttpContext 这个……我想就不用再介绍了&#xff0c;SharePoint运行在标准的ASP.NET框架下&#xff08;2003用的不是标准的ASP.NET 1.1&#xff0c;不过这年头还有人用2003么&#xff09;&#xff0c;所以这个对象的使用和ASP.NET没有任何区别。…

Python 字符串前面加u,r,b,f的含义

1、字符串前加 u 例&#xff1a;u"我是含有中文字符组成的字符串。" 作用&#xff1a; 后面字符串以 Unicode 格式 进行编码&#xff0c;一般用在中文字符串前面&#xff0c;防止因为源码储存格式问题&#xff0c;导致再次使用时出现乱码。 2、字符串前加 r 例&a…

【转】aspx,ascx和ashx使用小结

做asp.net开发的对.aspx,.ascx和.ashx都不会陌生。关于它们&#xff0c;网上有很多文章介绍。“纸上得来终觉浅&#xff0c;绝知此事要躬行”&#xff0c;下面自己总结一下做个笔记。1、.aspx Web窗体设计页面。Web窗体页由两部分组成&#xff1a;视觉元素&#xff08;html、服…

【转】执行Import-SPWeb报错Import-SPWeb : Requested value 'PublishingPages' was not found

Import-SPWeb : Requested value PublishingPages was not found. 【解决办法】 1.找到CPM文件 2.把cpm文件后缀名改为cab&#xff0c;如果有多个cmp需要把所有文件改为cab 3.使用cmd全部解压&#xff0c;然后找到Manifest.xml 4.找到“PublishingPages”&#xff0c;替换为…

【Gym - 101775J】Straight Master(差分,思维)

题干&#xff1a; A straight is a poker hand containing five cards of sequential rank, not necessarily to be the same suit. For example, a hand containing 7 club, 6 spade, 5 spade, 4 heart and 3 diamond forms a straight. In this problem, we extend the defi…

【转】Azure DevOps —— Azure Board 之 长篇故事、特性、用户情景(故事)的用法应用场景

前提 我以前在之前的文章里大概介绍了 Azure Board 的基本使用&#xff0c;可以回看《Azure Board 的基本使用》。如果你想使用 Azure Board 来安排工作的话&#xff0c;请提前了解《敏捷开发》的相关知识。 作者将使用 “Agile” 作为项目的模板&#xff0c;不明白的先阅读《…

【VIJOS - P1037】搭建双塔(dp)

题干&#xff1a; 描述 2001年9月11日&#xff0c;一场突发的灾难将纽约世界贸易中心大厦夷为平地&#xff0c;Mr. F曾亲眼目睹了这次灾难。为了纪念“9?11”事件&#xff0c;Mr. F决定自己用水晶来搭建一座双塔。 Mr. F有N块水晶&#xff0c;每块水晶有一个高度&#xff0…

【转】10分钟精通SharePoint - VS开发模板

Visual Studio是SharePoint开发的最锋利的利器&#xff08;没有之一哦&#xff09;&#xff0c;是必不可少的开发工具。VS一直为SharePoint开发保驾护航。 提供了以下功能开发模板&#xff1a; WebPart &#xff1a;服务器端控件 SharePoint中最常用的展示控件之一&#xff…