(小甲鱼python)类和对象(III)总结 类的绑定,self,__dict__的妙用

news/2024/10/23 3:40:30/

一、基础复习

1.类和对象(I)总结 类的定义、self的用法
2.类的继承、类的判断isinstance()、issubclass()、多重继承、类的组合

二、类的绑定

1.类的绑定(self的妙用)
例1:

>>> class Cat:def say(self):print("喵喵喵")>>> class Dog:def say(self):print("啊呦,,,,")>>> class Turtle:def say(self):print("不积跬步无以至千里。")>>> class Garden:t=Turtle()c=Cat()d=Dog()def say(self):self.t.say()self.c.say()self.d.say()>>> g=Garden()
>>> g.say()
不积跬步无以至千里。
喵喵喵
啊呦,,,,
>>> 

这里需要用到self.t.say(),而不是t.say(),t.say()会报错

>>> class Garden:t=Turtle()c=Cat()d=Dog()def say(self):t.say()         #会报错c.say()d.say()>>> g=Garden()
>>> g.say()
Traceback (most recent call last):File "<pyshell#34>", line 1, in <module>g.say()File "<pyshell#32>", line 6, in sayt.say()
NameError: name 't' is not defined

例2:
c中定义的元素d中没有定义,所以会报错。

>>> d=C()
>>> d.x=234
>>> c.x
>>> d=C()
>>> d.x=234
>>> c.x
Traceback (most recent call last):File "<pyshell#50>", line 1, in <module>c.x
AttributeError: 'C' object has no attribute 'x'

2.查看属性__dict__
dict左右有两个下划线
例3:

>>> c.__dict__
{'x': 520}
>>> d.__dict__
{'x': 234}
>>> d.y=660
>>> d.__dict__
{'x': 234, 'y': 660}

例4:

>>> class C:def set_x(self,v):self.x=v>>> c=C()
>>> c.__dict__
{}
>>> c.set_x(250)
>>> c.__dict__
{'x': 250}
>>> c.x
250

3.最简单类元素定义
例5:
定义一个空的类,然后对类进行属性的赋值。

>>> class C:pass>>> C.x=250
>>> C.y="小甲鱼"
>>> C.z=[1,2,3]
>>> print(C.x)
250
>>> 
>>> print(C.y)
小甲鱼
>>> 
>>> print(C.z)
[1, 2, 3]

例6:

>>> d={}
>>> d['x']=250
>>> d['y']="小甲鱼"
>>> d['z']=[1,2,3]
>>> print(d['x'])
250
>>> print(d['y'])
小甲鱼
>>> print(d['z'])
[1, 2, 3]
>>> 
>>> 
>>> class C:pass>>> c=C()
>>> c.x=250
>>> c.y="小甲鱼"
>>> c.z=[1,2,3]

课后题:
1.请问方法绑定的意义是什么?
答:共享!
解析:一辆共享单车,如何识别是谁在骑它?无非就是通过扫码绑定
一样的道理,为了节约内存,Python 没必要为每一个对象的方法都做一次拷贝,但如何区分是谁在调用?
通过 self 参数的绑定来识别嘛
2. 下面代码中,调用 c.hello() 和 C.hello© 的结果是一样的,请问它们是完全等价的吗?

>>> class C:
...     def hello(self):
...         print("Hello FishC.")
...
>>> c = C()
>>> c.hello()
Hello FishC.
>>> C.hello(c)
Hello FishC.

答:是的。
解析:
是的!方法相比函数来说,确实就是多了这么一个绑定的操作。因此,C.hello© 属于函数调用,而 c.hello() 则属于方法调用。
3.请问下面代码会打印什么呢?

>>> class C:
...     x = 100
...     def get_x(self):
...         print(x)
...
>>> c = C()
>>> c.x = 250
>>> c.get_x()
>>> # 请问这里会打印什么内容?

答:会报错(抛出异常 NameError: name ‘x’ is not defined)。
解析:在类的方法中直接访问 x 属性,并不会去对象或者类中找 x,根据 LEGB 原则,去找对应的变量。
理解了下面代码,大家应该就很清晰了:

>>> x = 123
>>> class C:
...     x = 100
...     def get_x(self):
...         print(f"x = {x}")
...         print(f"self.x = {self.x}")
...
>>> c = C()
>>> c.get_x()
x = 123
self.x = 100
>>> c.x = 250
>>> c.get_x()
x = 123
self.x = 250

4.请问下面代码会打印什么呢?

>>> class C:
...     x = 100
...     def get_x(self):
...         print(self.x)
...
>>> c = C()
>>> c.x = 250
>>> c.get_x()
>>> # 请问这里会打印什么内容?

答:250
解析:这里 c.x = 250,设置的是对象的 x 属性,当对象设置了属性之后,就不会再去访问其类的同名属性了。
5.请问下面代码会打印什么呢?

>>> class C:
...     x = 100
...     def get_x(self):
...         print(C.x)
...
>>> c = C()
>>> c.x = 250
>>> c.get_x()
>>> # 请问这里会打印什么内容?

答:100
解析:虽然 c.x = 250 设置的是对象的 x 属性,但是这里的细节是 print(C.x),所以打印的永远是类的 x 属性(而非对象的)。
6. 请问下面代码会打印什么呢?

>>> class C:
...     def f(self):
...         print("Hello FishC.")
...
>>> c = C()
>>> type(C.f) == type(c.f)
>>> # 请问这里会打印什么内容?

答:False。
解析:因为一个是函数(在类中定义,它还是一个函数),一个是方法(绑定了对象,那么它就是一个方法)。

>>> type(C.f)
<class 'function'>
>>> type(c.f)
<class 'method'>

7.请问下面代码会打印什么呢?

>>> class C:
...     x = []
...     def add_x(self, x):
...         self.x.append(x)
...
>>> c = C()
>>> d = C()
>>> c.add_x(250)
>>> d.add_x(520)
>>> c.x
>>> # 请问这里会打印什么内容?

答:[250, 520]
解析:
列表这类容器啊,就是这样的。它是单独存储的,然后所有它的引用都是指向相同的位置。


http://www.ppmy.cn/news/128362.html

相关文章

【sigslot】palacaze 基础例子

引入plog 打印到控制台 #include <sigslot/signal.hpp> #include <iostream> #include "H:\\net\\zeromq\\zeromq-4.3.4\\plog-1.1.9\\include\\plog\\Log.h" #include "H:\\net\\zeromq\\zeromq-4.3.4\\plog-1.1.9\\include\\plog\\Init.h"

冰蓝依赖 e-iceblue的spire.office依赖 下载报错

在maven的配置settings.xml文件中添加下列内容 <mirrors><mirror><id>com.e-iceblue</id><url>http://repo.e-iceblue.cn/repository/maven-public/</url><mirrorOf>com.e-iceblue</mirrorOf><name>com.e-iceblue</…

CPU E3-1230v2 开盖

为什么80%的码农都做不了架构师&#xff1f;>>> 某宝上买的E3-1230v2觉得温度有点高&#xff0c;开盖凉快一下。 工具&#xff1a;得力美工刀&#xff0c;热风焊台 过程&#xff1a;用热风枪300度吹金属盖&#xff0c;到烫手时用美工刀切&#xff0c;用热风枪吹的原…

萝莉遥控乐高电机

文章背景&#xff1a; 前段时间买了一辆积木拼搭的玩具车&#xff0c;春节几天把他组装好了&#xff0c;拥有遥控控制转向以及前进后退的功能。但自带的电池以及遥控感觉不太好用&#xff0c;特别是电池&#xff0c;充电两小时&#xff0c;跑起来五分钟。太不耐用了 自带遥控…

别克推出首款Ultium奥特能车型——ELECTRA E5

车控快讯&#xff08;文/每日一CHEK&#xff09;别克品牌推出首款Ultium奥特能车型——ELECTRA E5&#xff0c;是一款满足中国主流用户出行需求的越级大五座智电SUV&#xff0c;采用全新电动车设计语言&#xff0c;拥有越级品质空间和先进可靠的三电系统&#xff0c;同时搭载全…

达人评测 i3 13100和i3 13100f区别 i313100和i313100f对比

i3 13100采用10nm工艺 主频 3.4GHz 最高睿频 4.5GHz 四核心 八线程 三级缓存 12MB 热设计功耗(TDP) 60W支持最大内存 128GB 内存类型 DDR4 3200MHzDDR5 4800MHz集成显卡 Intel UHD Graphics 730 组装电脑选i3 13100还是i3 13100f怎么搭配更合适这些点很重要 http://www.adianna…

电动车质量最好的牌子是哪个?绿源INNO7给你答案

随着生活节奏加快&#xff0c;很多人会选择方便快捷的电动车代步。但是在选购电动车时&#xff0c;有些人却拿不定主意&#xff0c;不知道怎样才能不掉“坑”&#xff0c;选到质量在线的车子。 对此&#xff0c;小编推荐大家看看绿源液冷超续航系列的INNO7&#xff0c;质量杠杠…

中高端投影仪推荐,当贝F3 Air成4000元最值得买的投影仪

投影仪逐渐成为客厅必需品&#xff0c;每家装修时都要从电视机和投影仪中选一个作为后续的大屏娱乐设备&#xff0c;今天来聊聊中高端投影仪怎么选&#xff0c;中高端投影仪有什么推荐&#xff0c;目前主流市场中&#xff0c;投影仪的品牌无外乎当贝、极米、坚果等几大厂商&…