前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >类,类对象和实例对象(第十四章)

类,类对象和实例对象(第十四章)

作者头像
天钧
发布2019-07-26 17:20:14
7080
发布2019-07-26 17:20:14
举报
文章被收录于专栏:渗透云笔记渗透云笔记
代码语言:javascript
复制
>>> class C:
...     count = 0
...
>>> a = C()
>>> b = C()
>>> c = C()
>>> print(a.count,b.count,c.count)
0 0 0
>>> c.count +=100
>>> print(a.count,b.count,c.count)
0 0 100
>>> C.count +=100
>>> print(a.count,b.count,c.count)
100 100 100

上面可以看出,对实例对象c的count的属性进行赋值后,就相当于覆盖了类对象C的count属性。如果没有赋值覆盖,那么引用的是类对象的count属性。

有点绕对吧

看一下图就很好理解了

注意;类中定义的属性是静态变量,也就是相当于C语言中加上static声明的变量,类的属性食欲类对象进行绑定,并不会以来任何他的实例对象。

如果属性跟方法名相同,属性会覆盖方法

代码语言:javascript
复制
>>> class C:
...     def x(self):
...             print("xman")#如果属性跟方法名相同,属性会覆盖方法
...

>>> c = C()

>>> c.x()
xman

>>> c.x = 1#覆盖

>>> c.x()
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
TypeError: 'int' object is not callable

>>> c.x#覆盖后属性为1 ,也即是变量会覆盖函数
1
>>>

规则

  • 类的定义要少吃多餐,不要试图在一个类里边定义出所有能想到的特性和方法,应该利用继承和组合机制来进行扩展
  • 用不同的词性,如属性(变量)用名词,方法(函数)用动词,都采用

骆驼命名法

代码语言:javascript
复制
printEmployeePaychecks();
print_employee_paychecks();

第一个函数名使用了骆驼式命名法——函数名中的每一个逻辑断点都有一个大写字母来标记;

第二个函数名使用了下划线法----函数名中的每一个逻辑断点都有一个下划线来标记。

什么是绑定

代码语言:javascript
复制
>>> class CC:
...     def setXY(self,x,y):
...             self.x = x
...             self.y = y
...     def printXY(self):
...             print(self.x,self.y)
...
>>> dd = CC()
>>> dd.setXY(2,4)
>>> dd.printXY()
2 4
>>>

可以使用__dict__查看对象的的所有属性

代码语言:javascript
复制
>>> class CC:
...     def setXY(self,x,y):
...             self.x = x
...             self.y = y
...     def printXY(self):
...             print(self.x,self.y)
...
>>> dd = CC()
>>> dd.setXY(2,4)
>>> dd.printXY
<bound method CC.printXY of <__main__.CC object at 0x02AA1D30>>
>>> dd.printXY()
2 4
>>> dd.__dict__
{'y': 4, 'x': 2}
>>> CC.__dict__
mappingproxy({'printXY': <function CC.printXY at 0x02AA4228>, '__dict__': <attribute '__dict__' of 'CC' objects>, '__weakref__': <attribute '__weakref__' of 'CC' objects>, '__doc__': None, 'setXY': <function CC.setXY at 0x02AA4270>, '__module__': '__main__'})
>>>

__dict__属性是由一个字典组成,字典中仅有得实例对象的属性,不显示类属性和特殊属性,键表示属性名,值表示对键对应的

代码语言:javascript
复制
>>> dd.printXY()
2 4
>>> dd.__dict__
{'y': 4, 'x': 2}

兑现实例对象dd有了两个新属性,而是这两个属性是仅属于实例对象的

代码语言:javascript
复制
>>> CC.__dict__
mappingproxy({'printXY': <function CC.printXY at 0x02AA4228>, '__dict__': <attribute '__dict__' of 'CC' objects>, '__weakref__': <attribute '__weakref__' of 'CC' objects>, '__doc__': None, 'setXY': <function CC.setXY at 0x02AA4270>, '__module__': '__main__'})

这完全归功于self参数,当时离对象dd去调用setXY方法的时候,他传入的第一个参数就是dd,那么self.x=2,self.y=4.也就相当于dd.x=2,dd.y=4所以你在实例对象,甚至类对象中都看不到xy因为这两个属性只属于实例对象dd的

如果删除类对象,还是可以使用dd来调用printXY方法

本文参与 腾讯云自媒体分享计划,分享自微信公众号。
原始发表:2019-06-10,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 渗透云笔记 微信公众号,前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体分享计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档