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 元类使用说明
Dec 18 Python
python实现将元祖转换成数组的方法
May 04 Python
Python的mysql数据库的更新如何实现
Jul 31 Python
Python编写一个优美的下载器
Apr 15 Python
Django框架模板介绍
Jan 15 Python
解决项目pycharm能运行,在终端却无法运行的问题
Jan 19 Python
Python中实现输入一个整数的案例
May 03 Python
使用Python实现批量ping操作方法
May 06 Python
Python中Selenium模块的使用详解
Oct 09 Python
python openCV自制绘画板
Oct 27 Python
python自动化之如何利用allure生成测试报告
May 02 Python
Python可视化神器pyecharts之绘制地理图表练习
Jul 07 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自动生成月历代码
2006/10/09 PHP
简单的PHP图片上传程序
2008/03/27 PHP
php自动适应范围的分页代码
2008/08/05 PHP
php利用反射实现插件机制的方法
2015/03/14 PHP
PHP使用内置dir类实现目录遍历删除
2015/03/31 PHP
PHP实现XML与数据格式进行转换类实例
2015/07/29 PHP
jQuery 动画弹出窗体支持多种展现方式
2010/04/29 Javascript
原生js实现改变随意改变div属性style的名称和值的结果
2013/09/26 Javascript
js判断页面中是否有指定控件的简单实例
2014/03/04 Javascript
jquery日历控件实现方法分享
2014/03/07 Javascript
javascript教程:关于if简写语句优化的方法
2014/05/17 Javascript
js文本框走动跑马灯效果代码分享
2015/08/25 Javascript
AngularJs基于角色的前端访问控制的实现
2016/11/07 Javascript
react-router4 配合webpack require.ensure 实现异步加载的示例
2018/01/18 Javascript
jQuery实现的简单拖拽功能示例【测试可用】
2018/08/14 jQuery
Vue自定义指令写法与个人理解
2019/02/09 Javascript
通过原生vue添加滚动加载更多功能
2019/11/21 Javascript
Electron 打包问题:electron-builder 下载各种依赖出错(推荐)
2020/07/09 Javascript
不依任何赖第三方,单纯用vue实现Tree 树形控件的案例
2020/09/21 Javascript
jQuery实现全选按钮
2021/01/01 jQuery
[01:50]《我与DAC》之玩家:iG夺冠时的那面红旗
2018/03/29 DOTA
[01:02:55]CHAOS vs Mineski 2019国际邀请赛小组赛 BO2 第二场 8.16
2019/08/18 DOTA
一篇不错的Python入门教程
2007/02/08 Python
Python之web模板应用
2017/12/26 Python
Python实现改变与矩形橡胶的线条的颜色代码示例
2018/01/05 Python
python用post访问restful服务接口的方法
2018/12/07 Python
python矩阵的转置和逆转实例
2018/12/12 Python
python自动化测试之如何解析excel文件
2019/06/27 Python
Solid & Striped官网:美国泳装品牌
2019/06/19 全球购物
污水厂厂长岗位职责
2014/01/04 职场文书
学术会议欢迎词
2014/01/09 职场文书
反对邪教标语
2014/06/30 职场文书
回复函范文
2015/07/14 职场文书
2015高中教师个人工作总结
2015/07/21 职场文书
生活小常识广播稿
2015/08/19 职场文书
2016年九九重阳节活动总结
2016/04/01 职场文书