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 · 1717 次点击
    这是一个创建于 860 天前的主题,其中的信息可能已经有所发展或是发生改变。
    老师说:类是用来高效管理属性代码和行为代码的。类就相当于是对一个或多个函数的封装

    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   ·   实用小工具   ·   3373 人在线   最高记录 6679   ·     Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 · 23ms · UTC 00:05 · PVG 08:05 · LAX 16:05 · JFK 19:05
    Developed with CodeLauncher
    ♥ Do have faith in what you're doing.