标题:python中的类和函数的区别是什么?
只看楼主
wufaxian
Rank: 1
等 级:新手上路
帖 子:22
专家分:0
注 册:2021-9-19
结帖率:42.86%
已结贴  问题点数:5 回复次数:4 
python中的类和函数的区别是什么?
老师说:类是用来高效管理属性代码和行为代码的。类就相当于是对一个或多个函数的封装
程序代码:
class People:
      def _init_(self,N,A):
        self.name = N
        self.age = A
      def selfintro(self):
        print(f'大家好,我叫{self.name},今年{self.age}岁。')

P1 = People( 'Jack',12)
P2 = People( 'Paul', 11)

P1.selfintro()
P2.selfintro()

关于上面这段代码,有几个问题。
1、def _init_(self,N,A):这一段主要是定义对象属性。类和函数的主要区别就是类可以定义对象属性?进而可以Jack = People( 'Jack',12)来方便的实例化一个对象。使它也有相同“格式”的属性?这一点函数绝对无法实现的么?
2、老师说这一段 def selfintro(self): 是在定义行为。但是我的感觉就是在类里面嵌套了一个函数。然后是你可以在外面针对同一类对象调用这个函数,例如:P1.selfintro()。感觉这部分和函数调用没有任何区别,我理解对么?
3、为什么def _init_(self,N,A): 这一段就是定义属性,而def selfintro(self):就是定义行为。python解释器是怎么知道前一个是定义属性?后一个是定义行为?两句都是def 开头的啊。
4、上面代码为什么会在第五行报错?

[此贴子已经被作者于2022-7-8 22:21编辑过]

搜索更多相关主题的帖子: def 属性 函数 区别 定义 
2022-07-08 22:16
古123
Rank: 9Rank: 9Rank: 9
等 级:贵宾
威 望:14
帖 子:219
专家分:1098
注 册:2017-2-5
得分:2 
以下仅为个人观点,期望指正
1.类和函数不是一个级别的概念,类是为了实现面向对象的封装(当然我不知道类和面向对象谁先出现,是为了实现面向对象发明了类还是在实际生产中出现了类继而产生面向对象的概念),我不知道你说的格式是指什么,但是如果指具体的功能,我想这和函数还是类没有关系,都能实现,类只是封装。
2.调用对象的方法和调用函数使用上没有任何区别,但是可能为了某种理由如高效或娱乐将两者的具体实现分开,比如两者在内存中的设计之类的。
3.类属性在类中是变量,在python规定中,__init__是一个特殊的函数,在类实例化的过程中,如果存在该函数,python会自动去运行一遍里面的代码
4.报错的原因是__init__左右为双下划线,你只写了一个
2022-07-09 07:06
wufaxian
Rank: 1
等 级:新手上路
帖 子:22
专家分:0
注 册:2021-9-19
得分:0 
回复 楼主 wufaxian
————2022 年 7 月 9 日 15:03 更新 —————
看了很多不同论坛的回复,很有启发。也反思了一下自己的困惑到底是什么?
本人非计算机专业,入门语言是大学学的 C 语言。于是形成了一种惯性思维,什么都可以用函数解决。
看了 python 入门书,当中提到了类,面向对象。同时也参考了一些介绍面向对象编程的视频,文章。看后感觉似懂非懂。

所谓 “似懂”:我能看懂创建一个类,大致分两部分。
1、定义属性:似乎是做了一个数据模板 (好比是做糕点的模具、也可以看作做了一个标准化的机器人)。
2、定义方法:针对上面的机器人定义了一些针对机器人的命令,使机器人可以完成特定动作。跳,走。蹲……

实例化一个对象,好比用糕点模子拍面团。这样可以批量标准化的做出一样的糕点。也可以说批量化生产出一堆机器人。这些机器人诞生之日就可以自动支持标准指令 (类中已经定义好的方法)。

所谓 “非懂”。你非让我用 “类” 去编程,我也可以。但我感觉我在邯郸学步,只是做形式上的模仿,并没有体会到 “类” 的优点,便利。(之所有说优点,便利。是因为有人告诉我面向对象编程处理的问题,面向过程也都能解决。只是特定问题面向过程不如面向对象方便。)就是我觉得就用变量 + 函数,也可以实现上述效果。所以就会产生疑问,这地方为什么要用类,然后层层继承。看着眼晕。
类,似乎创建了一个私有的变量类型(定义属性)。且我为这个私有变量类型创建了特定的函数,即方法。
那我不用 “类” 这个工具,我以后创建同样类型变量的时候 Ctrl+c Ctrl+v 一下不就可以了。
另外类创建了一个模具可以批量的创建同样的私有变量(也就是实例化对象)。但是我真要批量的用类似 “P1 = People ( ‘Jack’,12)” 来实例化对象。也不会一行一行去手工敲代码。应该也是用循环语句或条件语句来创建吧。
考虑到一般大量的数据是放在数据库中的,完全可以通过给变量批量赋值来实现 “类” 批量制造标准的 “私有变量类型” 的目的。即通过赋值完成变量格式的定义。matlab 中有一种叫元胞数组的变量。它每个单元既可以装字符串,也可以装数值 (整数,浮点都可以)。非常灵活。以上面的代码为例。我不用事先定义一个 people 类。数据在数据库中已经有 name、age 两列了。我从数据库中调数据,赋值给元胞数组变量。这样不就相当于 “实例化对象” 了么?至于针对这也对象的方法。我就编写特定函数来处理,实现我的目标就可以了。这样做相对于使用 “类” 有什么不方便的么?我体会不到。所以说是 “非懂”

总之,在我看来类里定义属性就像创建变量。定义方法就像创建函数。类就是把这两者打包了。打包有什么好处?没体会。我就直接定义变量。针对变量编写函数。有什么不好?不知道。

————- 以上之所以把我的思考过程写出来,是因为我的困惑来自于我固有的看法,其中可能包含不少谬误。放在这里可以使各位老师的指导更有针对性。

2022-07-09 15:03
chenyucheng
Rank: 3Rank: 3
来 自:浙江省台州市临海市
等 级:论坛游侠
威 望:3
帖 子:141
专家分:181
注 册:2022-7-1
得分:2 
回答:
1. 函数能实现带参数的,用静态变量,只不过只能搞一个,搞多个有点麻烦。类有类的优点,比如可以方便地创建多个“实例”。你可以想象,“类”是一个机器人,“函数”是一个小机器,机器人能做好多东西,小机器只能做几样。所以“类”有类的优点,“类”相当于是一个自定义的数据类型。
2. 不是的,类的“行为”能设置或获取自己(self)的参数。
3. 定义属性是在行为内定义属性,只要是设定“self”的值(设定一个实例自己的属性)或者直接设定这个类(如加一个People.num表示人数,或在行为之外定义className表示类名)的属性(每个实例共同的属性),都是设定类的属性。而且两个函数都是定义行为,只不过“__init__”可以在实例化类的时候初始化类的参数。
4. 你写错了,"_init_"正确的左右两边不是各一个下划线,而是左右两边各两个下划线,即"__init__"。

爱玩编程的小学生,有Python,但只会一点点C++。

版主->斑竹->竹子,所以版主是竹子。(doge)
//不要让我当版主
2022-07-10 23:01
fall_bernana
Rank: 11Rank: 11Rank: 11Rank: 11
等 级:贵宾
威 望:17
帖 子:240
专家分:2086
注 册:2019-8-16
得分:2 
回复 3楼 wufaxian
不同类里可以定义相同名称的方法。函数不可以。 类主要给别人用,函数是给自己用的。
类可以继承,继承后的类的方法想用的继续用,不想用的可以自己实现,别的人再用的时候就方便了。就是类的多态性。
2022-07-11 11:37



参与讨论请移步原网站贴子:https://bbs.bccn.net/thread-509525-1-1.html




关于我们 | 广告合作 | 编程中国 | 清除Cookies | TOP | 手机版

编程中国 版权所有,并保留所有权利。
Powered by Discuz, Processed in 0.247847 second(s), 7 queries.
Copyright©2004-2024, BCCN.NET, All Rights Reserved