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魔法方法-属性访问控制详解
Jul 25 Python
python 用正则表达式筛选文本信息的实例
Jun 05 Python
python 的 scapy库,实现网卡收发包的例子
Jul 23 Python
python实现简易学生信息管理系统
Apr 05 Python
PyCharm License Activation激活码失效问题的解决方法(图文详解)
Mar 12 Python
利用pyecharts读取csv并进行数据统计可视化的实现
Apr 17 Python
浅谈matplotlib中FigureCanvasXAgg的用法
Jun 16 Python
Python中logger日志模块详解
Aug 04 Python
详解python内置模块urllib
Sep 09 Python
Python操作dict时避免出现KeyError的几种解决方法
Sep 20 Python
总结几个非常实用的Python库
Jun 26 Python
Django实现WebSocket在线聊天室功能(channels库)
Sep 25 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
用PHPdig打造属于你自己的Google[图文教程]
2007/02/14 PHP
PHP 写文本日志实现代码
2010/05/18 PHP
用函数式编程技术编写优美的 JavaScript_ibm
2008/05/16 Javascript
js中parseFloat(参数1,参数2)定义和用法及注意事项
2013/01/27 Javascript
js操作iframe的一些方法介绍
2013/06/25 Javascript
jquery重新播放css动画所遇问题解决
2013/08/21 Javascript
Javascript正则控制文本框只能输入整数或浮点数
2014/09/02 Javascript
用C/C++来实现 Node.js 的模块(二)
2014/09/24 Javascript
分享12个实用的jQuery代码片段
2016/03/09 Javascript
JavaScript注入漏洞的原理及防范(详解)
2016/12/04 Javascript
基于jPlayer三分屏的制作方法
2016/12/21 Javascript
JavaScript数据结构中栈的应用之表达式求值问题详解
2017/04/11 Javascript
JavaScript Canvas绘制圆形时钟效果
2020/08/20 Javascript
JS中Safari浏览器中的Date
2017/07/17 Javascript
vue 使用自定义指令实现表单校验的方法
2018/08/28 Javascript
详解vue中的父子传值双向绑定及数据更新问题
2019/06/13 Javascript
js变量值传到php过程详解 将php解析成数据
2019/06/26 Javascript
python脚本内运行linux命令的方法
2015/07/02 Python
python实现给数组按片赋值的方法
2015/07/28 Python
python 利用文件锁单例执行脚本的方法
2019/02/19 Python
利用python实现短信和电话提醒功能的例子
2019/08/08 Python
Python List列表对象内置方法实例详解
2019/10/22 Python
django3.02模板中的超链接配置实例代码
2020/02/04 Python
在 Linux/Mac 下为Python函数添加超时时间的方法
2020/02/20 Python
QML实现钟表效果
2020/06/02 Python
详解使用CSS3的@media来编写响应式的页面
2017/11/01 HTML / CSS
联想西班牙官网:Lenovo西班牙
2018/08/28 全球购物
意大利网上药房:Farmacia 33
2020/01/27 全球购物
培训自我鉴定
2014/01/31 职场文书
机械设计制造及其自动化专业求职信
2014/06/17 职场文书
安全责任书怎么写
2014/07/28 职场文书
大学竞选班干部演讲稿
2014/08/21 职场文书
缓刑期间思想汇报范文
2014/10/10 职场文书
2014年政风行风自查自纠报告
2014/10/21 职场文书
2015年初一班主任工作总结
2015/05/13 职场文书
中学校园广播稿
2015/08/18 职场文书