Python 中的类和函数的区别是什么?

2022-07-09 01:02:18 +08:00
 huzhikuizainali
老师说:类是用来高效管理属性代码和行为代码的。类就相当于是对一个或多个函数的封装

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 、上面代码为什么会在第五行报错?
1729 次点击
所在节点    Python
11 条回复
noe132
2022-07-09 01:30:21 +08:00
把函数和状态搓到一起放在一个对象上面,通过这个对象来解决状态和操作的封装,这种编程思路就是面向对象编程。
你觉得类和函数有点像,是因为类的构造函数 __init__ 也是一种函数。
在类上面的函数叫做方法。方法和普通函数的区别就是方法在实例上被调用会自动传 self 参数。
为什么会报错?因为你写错了。__init__前后有 2 个下划线
ccdjh
2022-07-09 07:38:46 +08:00
感觉是 java 老师教 python 。python 就是随心所欲,没有那么多框架。估计下节课就是教继承 -_-
你一样可以使用函数:
>>> def selfintro(name,age):
... print(f'hello,i am {name},{age} years old')
...
>>> selfintro('huzh',18)
hello,i am huzh,18 years old

__init__ 是设置定义 class People 的参数。因为类不像函数可以在后面写参数。至于为什么是用__init__,这是 python 的作者自己决定的。至于为啥有函数还要用类,方便你某些情景使用,不一定要你用。
jaredyam
2022-07-09 10:12:13 +08:00
类是基于面向对象编程这一思想的封装形式,所谓属性和行为是基于这一思想范式而描述的。函数是在编程语言层对具有特定约束的输入输出过程的封装,在类中我们可以赋予它对象行为的内涵。
nekochyan
2022-07-09 10:24:10 +08:00
我觉得你不是对 Python 中的类和函数有疑问,而是你对类和函数的概念都没有搞清楚
yuelang85
2022-07-09 10:25:17 +08:00
你这么想:


类内部的函数之间可以通过 “非传参” 以及 “非全局变量” 的形式共享资源。


基于这个思路,你可以想象 class 内部函数 都属于 “同一类” 函数
huzhikuizainali
2022-07-09 11:14:31 +08:00
@yuelang85 谢谢回复。我可能没太看懂你的意思。def selfintro(self):
print(f'大家好,我叫{self.name},今年{self.age}岁。') 这段代码不就在类的内部。self 不就作为 selfintro 的输入参数么?为什么说类“类内部的函数之间可以通过 “非传参” 以及 “非全局变量” 的形式共享资源。”呢?
Loovemaker
2022-07-09 11:43:55 +08:00
a
Loovemaker
2022-07-09 11:53:20 +08:00
Hi ,@huzhikuizainali:

> 为什么说类“类内部的函数之间可以通过 “非传参” 以及 “非全局变量” 的形式共享资源。”呢?

“非全局变量”好理解,资源都封装在 class 里面了;
我对“非传参”的理解是:写在 class 里面的几个 def 实际是属于 class 的。Python 的确是用一个小语法糖,把`People.selfintro(P1)`转换成了`P1.selfintro()`,看起来好像是要传入`self`作为参数。
但是,这是 Python 要求的,在很多面向对象编程的环境(其它语言)中,是不需要开发者写这个传入`self`的操作的,那种情况下开发者就算不传也不写,编译器也能知道;以我的毕生所学,这样才是主流?

额,上面那条 a 有办法清理嘛?
yuelang85
2022-07-09 14:22:43 +08:00
@huzhikuizainali

因为代码没排版,我没细看,所以我当时就是回复你 “类” 和 “函数” 的关系。其实也就解释了你第一第二个问题。什么使用类?什么时候把函数放在类里面?什么时候使用独立函数?



使用类,你处理一组资源的时候,你只需要携带一个对象,修改对象属性,查看对象属性,只需要 “对象.修改 xxxx()“就可以了。


不使用类,这一堆属性,函数,互相之间没有关联,要想互相作用,就需要传参,比如 “修改 xxxx(xxxx)“



第五行报的什么错?


你第三个问题,老师实际想说的 init 函数里面的内容 是在定义属性。selfintro 的内容 是在“做具体行为”。



你是在“编程猿” 学的吗?这个代码风格和说话风格都很。。。java 。我觉得你不如买一本 python 书来看看。
fbichijing
2022-07-10 01:22:38 +08:00
多写,多看。
觉得老师的话没道理,就不要听。
llsquaer
2022-07-11 14:34:30 +08:00
别绕,最开始被老师带到沟里了...讲了一堆概念.完全不理解.. 后来自己写多了总结出来..

类 , 就是把相关的函数打包在一起搞事情
函数 , 单纯就处理某个事情

比如. 你写一个爬虫. 每个页面都要 请求网站 , 解析提取 , 要存储
正常情况下..函数都不用一直往下写,都是没问题的, 只要你思维清晰.不嫌代码多

后来觉得代码太长了..而且有很多是相同的代码..这个时候你想起来需要函数封装一些常用功能..这里你用了函数.比如,请求取名 my_request ,提取数据 get_value , 存储 save_db

然后你把 提取网页, url 去重,,存储数据库,的步骤都写成函数了..后来发现..函数巨多..搞的头晕..

这个时候.你就可以把函数分一个类别.....这 类 的概念不就出来了么? 请求网页一个类别, 存储一个类别, 提取数据一个类别

这就是类..


后来你更深入的发现..类 是可以多个实例的.互不干扰. 类变量是私有的.和其他类不冲突..恭喜你..类的基本用法已经掌握..剩下的就看你的骚操作

这是一个专为移动设备优化的页面(即为了让你能够在 Google 搜索结果里秒开这个页面),如果你希望参与 V2EX 社区的讨论,你可以继续到 V2EX 上打开本讨论主题的完整版本。

https://www.v2ex.com/t/865037

V2EX 是创意工作者们的社区,是一个分享自己正在做的有趣事物、交流想法,可以遇见新朋友甚至新机会的地方。

V2EX is a community of developers, designers and creative people.

© 2021 V2EX