老师说:类是用来高效管理属性代码和行为代码的。类就相当于是对一个或多个函数的封装
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 、上面代码为什么会在第五行报错?
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 、上面代码为什么会在第五行报错?
11 条回复
|
1
noe132 2022 年 7 月 9 日
把函数和状态搓到一起放在一个对象上面,通过这个对象来解决状态和操作的封装,这种编程思路就是面向对象编程。
你觉得类和函数有点像,是因为类的构造函数 __init__ 也是一种函数。 在类上面的函数叫做方法。方法和普通函数的区别就是方法在实例上被调用会自动传 self 参数。 为什么会报错?因为你写错了。__init__前后有 2 个下划线 |
|
2
ccdjh 2022 年 7 月 9 日
感觉是 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 的作者自己决定的。至于为啥有函数还要用类,方便你某些情景使用,不一定要你用。 |
|
3
jaredyam 2022 年 7 月 9 日
类是基于面向对象编程这一思想的封装形式,所谓属性和行为是基于这一思想范式而描述的。函数是在编程语言层对具有特定约束的输入输出过程的封装,在类中我们可以赋予它对象行为的内涵。
|
|
4
nekochyan 2022 年 7 月 9 日
我觉得你不是对 Python 中的类和函数有疑问,而是你对类和函数的概念都没有搞清楚
|
|
5
yuelang85 2022 年 7 月 9 日
你这么想:
类内部的函数之间可以通过 “非传参” 以及 “非全局变量” 的形式共享资源。 基于这个思路,你可以想象 class 内部函数 都属于 “同一类” 函数 |
|
6
huzhikuizainali OP |
|
7
Loovemaker 2022 年 7 月 9 日
a
|
|
8
Loovemaker 2022 年 7 月 9 日
Hi ,@huzhikuizainali:
> 为什么说类“类内部的函数之间可以通过 “非传参” 以及 “非全局变量” 的形式共享资源。”呢? “非全局变量”好理解,资源都封装在 class 里面了; 我对“非传参”的理解是:写在 class 里面的几个 def 实际是属于 class 的。Python 的确是用一个小语法糖,把`People.selfintro(P1)`转换成了`P1.selfintro()`,看起来好像是要传入`self`作为参数。 但是,这是 Python 要求的,在很多面向对象编程的环境(其它语言)中,是不需要开发者写这个传入`self`的操作的,那种情况下开发者就算不传也不写,编译器也能知道;以我的毕生所学,这样才是主流? 额,上面那条 a 有办法清理嘛? |
|
9
yuelang85 2022 年 7 月 9 日
@huzhikuizainali
因为代码没排版,我没细看,所以我当时就是回复你 “类” 和 “函数” 的关系。其实也就解释了你第一第二个问题。什么使用类?什么时候把函数放在类里面?什么时候使用独立函数? 使用类,你处理一组资源的时候,你只需要携带一个对象,修改对象属性,查看对象属性,只需要 “对象.修改 xxxx()“就可以了。 不使用类,这一堆属性,函数,互相之间没有关联,要想互相作用,就需要传参,比如 “修改 xxxx(xxxx)“ 第五行报的什么错? 你第三个问题,老师实际想说的 init 函数里面的内容 是在定义属性。selfintro 的内容 是在“做具体行为”。 你是在“编程猿” 学的吗?这个代码风格和说话风格都很。。。java 。我觉得你不如买一本 python 书来看看。 |
|
10
fbichijing 2022 年 7 月 10 日
多写,多看。
觉得老师的话没道理,就不要听。 |
|
11
llsquaer 2022 年 7 月 11 日
别绕,最开始被老师带到沟里了...讲了一堆概念.完全不理解.. 后来自己写多了总结出来..
类 , 就是把相关的函数打包在一起搞事情 函数 , 单纯就处理某个事情 比如. 你写一个爬虫. 每个页面都要 请求网站 , 解析提取 , 要存储 正常情况下..函数都不用一直往下写,都是没问题的, 只要你思维清晰.不嫌代码多 后来觉得代码太长了..而且有很多是相同的代码..这个时候你想起来需要函数封装一些常用功能..这里你用了函数.比如,请求取名 my_request ,提取数据 get_value , 存储 save_db 然后你把 提取网页, url 去重,,存储数据库,的步骤都写成函数了..后来发现..函数巨多..搞的头晕.. 这个时候.你就可以把函数分一个类别.....这 类 的概念不就出来了么? 请求网页一个类别, 存储一个类别, 提取数据一个类别 这就是类.. 后来你更深入的发现..类 是可以多个实例的.互不干扰. 类变量是私有的.和其他类不冲突..恭喜你..类的基本用法已经掌握..剩下的就看你的骚操作 |
推荐学习书目
› 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