Python 类的特殊成员解析


Posted in Python onJune 20, 2018

类的成员有两种形式

公有成员,在任何地方都能访问

私有成员,只有在类的内部才能方法,私有成员命名时,前两个字符是下划线。

class Foo:
  def __init__(self, name, age):
    self.name = name
    self.__age = age

  def show(self):      # 间接方法私有字段
    return self.__age
  

obj = Foo('klvchen', 25)
print(obj.name)
res = obj.show()
print(res)

运行结果:

klvchen
25

公有静态字段:类可以访问;类内部可以访问;派生类中可以访问

私有静态字段:仅类内部可以访问;

class Foo:
  __v = '666'     # 私有静态字段
  def __init__(self):
    pass
  def show(self):
    return Foo.__v
obj = Foo()
res = obj.show()
print(res)

运行结果:

666

class Foo:
  __v = '666'
  def __init__(self):
    pass
  def show(self):
    return Foo.__v
  @staticmethod
  def stat():
    return Foo.__v
res = Foo.stat()
print(res)

运行结果:

666

无法从父类继承私有字段

class F:
  def __init__(self):
    self.ge = 123
    self.__gene = 456   #私有字段
class S(F):
  def __init__(self, name):
    self.name = name
    self.__age = 18
    super(S, self).__init__()
  def show(self):
    print(self.name)
    print(self.__age)
    print(self.ge)
    print(self.__gene)
s = S('klvchen')
s.show()

运行结果:

klvchen
18
123
AttributeError: 'S' object has no attribute '_S__gene'

类的特殊成员

int(对象),会自动执行对象中的__int__方法,并将返回赋值给 int 对象,同理 str(对象),会自动执行__str__方法,并返回赋值给 str 对象。

class Foo:
  def __init__(self):
    pass
  def __int__(self):
    return 666
  def __str__(self):
    return 'hello world'
obj = Foo()
print(obj, type(obj))
res = int(obj)
print(res)
res1 = str(obj)
print(res1)

运行结果:

<__main__.Foo object at 0x0000022BBE9DA978> <class '__main__.Foo'>
666
hello world

print(对象),str(对象),都会自动执行对象中的__str__方法,并返回

class Foo:
  def __init__(self, n, a):
    self.name = n
    self.age = a

  def __str__(self):
    return '%s-%d' %(self.name, self.age)

obj = Foo('klvchen', 28)
print(obj)

运行结果:

klvchen-28

两个对象相加时,自动执行第一对象的__add__方法,并且将第二个对象当参数传递进去

class Foo:
  def __init__(self, name, age):
    self.name = name
    self.age = age
  def __add__(self, other):
    return self.age + other.age
obj1 = Foo('klv1', 23)
obj2 = Foo('klv2', 24)
res = obj1 + obj2
print(res, type(res))

运行结果:

47 <class 'int'>
class Foo:
    def __init__(self, name, age):
        self.name = name
        self.age = age
    def __add__(self, other):
        return Foo(obj1.name, obj2.age)
    def __del__(self):
        print('析构方法')
obj1 = Foo('klv1', 23)
obj2 = Foo('klv2', 24)
res = obj1 + obj2
print(res, type(res))

运行结果:

<__main__.Foo object at 0x0000016DFCE125C0> <class '__main__.Foo'>
析构方法
析构方法
析构方法

li[对象] 会自动执行 li 对象的类中的__getitem__方法,8当作参数传递给item

class Foo:
  def __init__(self, name, age):
    self.name = name
    self.age = age
  def __getitem__(self, item):
    return item
li = Foo('klvchen', 28)
r = li[8]
print(r)

运行结果:

8

类中的__setitem__,__delitem__方法

class Foo:
  def __init__(self, name, age):
    self.name = name
    self.age = age
  def __getitem__(self, item):
    return item
  def __setitem__(self, key, value):
    print(key, value)
  def __delitem__(self, key):
    print(key)
li = Foo('klvchen', 28)
r = li[8]
print(r)
li[100] = 'hello'
del li[999]

运行结果:

8
100 hello
999

执行类中的__iter__()方法,并获取其返回值,循环上一步中返回对象,用于迭代器,之所以列表、字典、元组可以进行for循环,是因为类型内部定义了iter

class Foo:
  def __init__(self, name, age):
    self.name = name
    self.age = age
  def __iter__(self):
    return iter([11, 22, 33])
li = Foo('klvchen', 26)
for i in li:
  print(i)

运行结果:

11
22
33

for 循环的内部操作

obj = iter([11, 22, 33])
while True:
  val = obj.next()
  print val

总结

以上所述是小编给大家介绍的Python 类的特殊成员解析,希望对大家有所帮助,如果大家有任何疑问请给我留言,小编会及时回复大家的。在此也非常感谢大家对三水点靠木网站的支持!

Python 相关文章推荐
在Python的Django框架中调用方法和处理无效变量
Jul 15 Python
在arcgis使用python脚本进行字段计算时是如何解决中文问题的
Oct 18 Python
Python机器学习之SVM支持向量机
Dec 27 Python
django使用xlwt导出excel文件实例代码
Feb 06 Python
Python socket实现的简单通信功能示例
Aug 21 Python
python matplotlib拟合直线的实现
Nov 19 Python
tensorflow 限制显存大小的实现
Feb 03 Python
Python正则表达式学习小例子
Mar 03 Python
Python-jenkins 获取job构建信息方式
May 12 Python
Python操作word文档插入图片和表格的实例演示
Oct 25 Python
解决Pycharm 运行后没有输出的问题
Feb 05 Python
OpenCV-Python模板匹配人眼的实例
Jun 08 Python
python实现音乐下载的统计
Jun 20 #Python
django2用iframe标签完成网页内嵌播放b站视频功能
Jun 20 #Python
python基于http下载视频或音频
Jun 20 #Python
python实现下载pop3邮件保存到本地
Jun 19 #Python
python+POP3实现批量下载邮件附件
Jun 19 #Python
python实现批量解析邮件并下载附件
Jun 19 #Python
Python3使用SMTP发送带附件邮件
Jun 16 #Python
You might like
PHP集成FCK的函数代码
2008/09/27 PHP
php中修改浏览器的User-Agent来伪装你的浏览器和操作系统
2011/07/29 PHP
php简单开启gzip压缩方法(zlib.output_compression)
2013/04/13 PHP
ThinkPHP安装和设置
2015/07/27 PHP
PHP实现的二分查找算法实例分析
2017/12/19 PHP
分享8个Laravel模型时间戳使用技巧小结
2020/02/12 PHP
js中的window.open返回object的错误的解决方法
2009/08/15 Javascript
2014最热门的JavaScript代码高亮插件推荐
2014/11/25 Javascript
javascript实现校验文件上传控件实例
2015/04/20 Javascript
使用AngularJS制作一个简单的RSS阅读器的教程
2015/06/18 Javascript
JavaScript和HTML DOM的区别与联系及Javascript和DOM的关系
2015/11/15 Javascript
Javascript小技能总结(推荐)
2016/06/02 Javascript
JS实现的集合去重,交集,并集,差集功能示例
2018/03/13 Javascript
JavaScript 九种跨域方式实现原理
2019/02/11 Javascript
JavaScript观察者模式原理与用法实例详解
2020/03/10 Javascript
Javascript中Math.max和Math.max.apply的区别和用法详解
2020/08/24 Javascript
[03:27]《辉夜杯》线下训练营 导师CU和海涛指点迷津
2015/10/23 DOTA
python使用xmlrpc实例讲解
2013/12/17 Python
Python如何通过subprocess调用adb命令详解
2017/08/27 Python
python django使用haystack:全文检索的框架(实例讲解)
2017/09/27 Python
python3.6+opencv3.4实现鼠标交互查看图片像素
2018/02/26 Python
python将秒数转化为时间格式的实例
2018/09/16 Python
linux查找当前python解释器的位置方法
2019/02/20 Python
Python实现获取系统临时目录及临时文件的方法示例
2019/06/26 Python
pycharm new project变成灰色的解决方法
2019/06/27 Python
wxpython+pymysql实现用户登陆功能
2019/11/19 Python
Pytest单元测试框架如何实现参数化
2020/09/05 Python
pandas apply使用多列计算生成新的列实现示例
2021/02/24 Python
ET Mall东森购物网:东森严选
2017/03/06 全球购物
Sunglass Hut巴西网上商店:男女太阳镜
2020/10/04 全球购物
演讲稿怎么写
2014/01/07 职场文书
雪山饭庄的创业计划书范文
2014/01/18 职场文书
2014年采购部工作总结
2014/11/20 职场文书
2015年少先队活动总结
2015/03/25 职场文书
公司会议开幕词
2016/03/03 职场文书
教你怎么用python selenium实现自动化测试
2021/05/27 Python