Python 中的类和函数的区别是什么? - V2EX
V2EX = way to explore
V2EX 是一个关于分享和探索的地方
现在注册
已注册用户请  登录
推荐学习书目
Learn Python the Hard Way
Python Sites
PyPI - Python Package Index
http://diveintopython.org/toc/index.html
Pocoo
值得关注的项目
PyPy
Celery
Jinja2
Read the Docs
gevent
pyenv
virtualenv
Stackless Python
Beautiful Soup
结巴中文分词
Green Unicorn
Sentry
Shovel
Pyflakes
pytest
Python 编程
pep8 Checker
Styles
PEP 8
Google Python Style Guide
Code Style from The Hitchhiker's Guide
huzhikuizainali
V2EX    Python

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

  •  
  •   huzhikuizainali 2022-07-09 01:02:18 +08:00 2201 次点击
    这是一个创建于 1266 天前的主题,其中的信息可能已经有所发展或是发生改变。
    老师说:类是用来高效管理属性代码和行为代码的。类就相当于是对一个或多个函数的封装

    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 、上面代码为什么会在第五行报错?
    noe132
        1
    noe132  
       2022-07-09 01:30:21 +08:00
    把函数和状态搓到一起放在一个对象上面,通过这个对象来解决状态和操作的封装,这种编程思路就是面向对象编程。
    你觉得类和函数有点像,是因为类的构造函数 __init__ 也是一种函数。
    在类上面的函数叫做方法。方法和普通函数的区别就是方法在实例上被调用会自动传 self 参数。
    为什么会报错?因为你写错了。__init__前后有 2 个下划线
    ccdjh
        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
        3
    jaredyam  
       2022-07-09 10:12:13 +08:00
    类是基于面向对象编程这一思想的封装形式,所谓属性和行为是基于这一思想范式而描述的。函数是在编程语言层对具有特定约束的输入输出过程的封装,在类中我们可以赋予它对象行为的内涵。
    nekochyan
        4
    nekochyan  
       2022-07-09 10:24:10 +08:00
    我觉得你不是对 Python 中的类和函数有疑问,而是你对类和函数的概念都没有搞清楚
    yuelang85
        5
    yuelang85  
       2022-07-09 10:25:17 +08:00
    你这么想:


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


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

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



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


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



    第五行报的什么错?


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



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

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

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

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

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

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

    这就是类..


    后来你更深入的发现..类 是可以多个实例的.互不干扰. 类变量是私有的.和其他类不冲突..恭喜你..类的基本用法已经掌握..剩下的就看你的骚操作
    关于     帮助文档     自助推广系统     博客     API     FAQ     Solana     5681 人在线   最高记录 6679       Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 28ms UTC 06:22 PVG 14:22 LAX 22:22 JFK 01:22
    Do have faith in what you're doing.
    ubao msn snddm index pchome yahoo rakuten mypaper meadowduck bidyahoo youbao zxmzxm asda bnvcg cvbfg dfscv mmhjk xxddc yybgb zznbn ccubao uaitu acv GXCV ET GDG YH FG BCVB FJFH CBRE CBC GDG ET54 WRWR RWER WREW WRWER RWER SDG EW SF DSFSF fbbs ubao fhd dfg ewr dg df ewwr ewwr et ruyut utut dfg fgd gdfgt etg dfgt dfgd ert4 gd fgg wr 235 wer3 we vsdf sdf gdf ert xcv sdf rwer hfd dfg cvb rwf afb dfh jgh bmn lgh rty gfds cxv xcv xcs vdas fdf fgd cv sdf tert sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf shasha9178 shasha9178 shasha9178 shasha9178 shasha9178 liflif2 liflif2 liflif2 liflif2 liflif2 liblib3 liblib3 liblib3 liblib3 liblib3 zhazha444 zhazha444 zhazha444 zhazha444 zhazha444 dende5 dende denden denden2 denden21 fenfen9 fenf619 fen619 fenfe9 fe619 sdf sdf sdf sdf sdf zhazh90 zhazh0 zhaa50 zha90 zh590 zho zhoz zhozh zhozho zhozho2 lislis lls95 lili95 lils5 liss9 sdf0ty987 sdft876 sdft9876 sdf09876 sd0t9876 sdf0ty98 sdf0976 sdf0ty986 sdf0ty96 sdf0t76 sdf0876 df0ty98 sf0t876 sd0ty76 sdy76 sdf76 sdf0t76 sdf0ty9 sdf0ty98 sdf0ty987 sdf0ty98 sdf6676 sdf876 sd876 sd876 sdf6 sdf6 sdf9876 sdf0t sdf06 sdf0ty9776 sdf0ty9776 sdf0ty76 sdf8876 sdf0t sd6 sdf06 s688876 sd688 sdf86