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

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


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


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

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

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

    额,上面那条 a 有办法清理嘛?
    yuelang85
        9
    yuelang85  
       203 天前
    @huzhikuizainali

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



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


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



    第五行报的什么错?


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



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

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

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

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

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

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

    这就是类..


    后来你更深入的发现..类 是可以多个实例的.互不干扰. 类变量是私有的.和其他类不冲突..恭喜你..类的基本用法已经掌握..剩下的就看你的骚操作
    关于   ·   帮助文档   ·   博客   ·   API   ·   FAQ   ·   我们的愿景   ·   广告投放   ·   实用小工具   ·   2729 人在线   最高记录 5497   ·     Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 · 39ms · UTC 01:35 · PVG 09:35 · LAX 17:35 · JFK 20:35
    Developed with CodeLauncher
    ♥ Do have faith in what you're doing.