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

>>> 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声明的变量,类的属性食欲类对象进行绑定,并不会以来任何他的实例对象。

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

>>> 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
>>>

规则

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

骆驼命名法

printEmployeePaychecks();
print_employee_paychecks();

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

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

什么是绑定

>>> 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__查看对象的的所有属性

>>> 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__属性是由一个字典组成,字典中仅有得实例对象的属性,不显示类属性和特殊属性,键表示属性名,值表示对键对应的

>>> dd.printXY()
2 4
>>> dd.__dict__
{'y': 4, 'x': 2}

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

>>> 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方法

本文分享自微信公众号 - 渗透云笔记(shentouyun)

原文出处及转载信息见文内详细说明,如有侵权,请联系 yunjia_community@tencent.com 删除。

原始发表时间:2019-06-10

本文参与腾讯云自媒体分享计划,欢迎正在阅读的你也加入,一起分享。

发表于

我来说两句

0 条评论
登录 后参与评论

相关文章

来自专栏FreeBuf

投递恶意lnk使用JwsclTerminalServer实现远程控制和信息获取

拼接字符串,调用bitsadmin.exe从远程服务器将加密后的文件下载到C:\Users\Public\Libraries\ldpwaf目录下,接着调用cer...

7010
来自专栏技术栈大杂烩

Python:线程为什么搞个setDaemon

使用 Python 都不会错过线程这个知识,但是每次谈到线程,大家都下意识说 GIL 全局锁,

15510
来自专栏简单的日记

Spring注解

在需要自动更新配置变量的Java类上,使用注解 @RefreshScope 修饰。

9810
来自专栏Linux知识积累

C++中函数异常规格的说明

10610
来自专栏跟Qt君学编程

Qml属性implicitWidth/Height与width/height区别

  implicitWidth/Height一般用在可重用控件,它也不是必要的,QtQuick可以没有者两个属性,只因为了方便而存在。qt例子描述到什么情况下用...

10010
来自专栏跟Qt君学编程

Qml绑定特性

8520
来自专栏简单的日记

tomcat开机启动和服务

说明: 这里的启动脚本可以把它分为3个部分,第一部分是申明启动脚本和注释,第二部分是定义路径的变量,第三部分是一个case...in条件选择结构。

18010
来自专栏眯眯眼猫头鹰的小树杈

leetcode436. Find Right Interval

假设一个二维的整数数组中每一行表示一个区间,每一行的第一个值表示区间的左边界,第二个值表示区间的右边界。现在要求返回一个整数数组,用来记录每一个边界右侧最邻近的...

8320
来自专栏简单的日记

myeclipse   set get带注释的方法

1:在myeclipse/eclisp中搜索找到org.eclipse.jdt.ui_*.jar(*是版本号)

9610
来自专栏复盘总结文章集合

MyEclipse生成javadoc文档

三。create javadoc for members with visibility解释 private 所有类和成员都生成

10720

扫码关注云+社区

领取腾讯云代金券

年度创作总结 领取年终奖励