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线程池(threadpool)模块使用笔记详解
Nov 17 Python
5款非常棒的Python工具
Jan 05 Python
详解Numpy中的数组拼接、合并操作(concatenate, append, stack, hstack, vstack, r_, c_等)
May 27 Python
Django ORM 聚合查询和分组查询实现详解
Aug 09 Python
django 自定义过滤器(filter)处理较为复杂的变量方法
Aug 12 Python
python配置文件写入过程详解
Oct 19 Python
使用PyTorch训练一个图像分类器实例
Jan 08 Python
Python sys模块常用方法解析
Feb 20 Python
python GUI库图形界面开发之PyQt5切换按钮控件QPushButton详细使用方法与实例
Feb 28 Python
python实现人像动漫化的示例代码
May 17 Python
Python并发爬虫常用实现方法解析
Nov 19 Python
matplotlib交互式数据光标实现(mplcursors)
Jan 13 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 操作调试的方法
2012/07/12 PHP
比较discuz和ecshop的截取字符串函数php版
2012/09/03 PHP
php将服务端的文件读出来显示在web页面实例
2016/10/31 PHP
JS 对输入框进行限制(常用的都有)
2013/07/30 Javascript
JavaScript中的普通函数与构造函数比较
2015/04/07 Javascript
JavaScript分页功能的实现方法
2015/04/25 Javascript
JavaScript中数据结构与算法(三):链表
2015/06/19 Javascript
PageSwitch插件实现100种不同图片切换效果
2015/07/28 Javascript
JavaScript学习笔记整理_setTimeout的应用
2016/09/19 Javascript
深入理解Javascript中的观察者模式
2017/02/20 Javascript
解决ztree搜索中多级菜单展示不全问题
2017/07/05 Javascript
nodejs开发微信小程序实现密码加密
2017/07/11 NodeJs
vue.js 使用axios实现下载功能的示例
2018/03/05 Javascript
Node.JS枚举统计当前文件夹和子目录下所有代码文件行数
2019/08/23 Javascript
Vue SSR 即时编译技术的实现
2020/05/06 Javascript
Python实现批量读取word中表格信息的方法
2015/07/30 Python
python的多重继承的理解
2017/08/06 Python
Python面向对象class类属性及子类用法分析
2018/02/02 Python
Python3爬虫学习之将爬取的信息保存到本地的方法详解
2018/12/12 Python
Django Python 获取请求头信息Content-Range的方法
2019/08/06 Python
Pytorch抽取网络层的Feature Map(Vgg)实例
2019/08/20 Python
python基于socket实现的UDP及TCP通讯功能示例
2019/11/01 Python
Python模块的定义,模块的导入,__name__用法实例分析
2020/01/07 Python
Python多进程multiprocessing、进程池用法实例分析
2020/03/24 Python
整理HTML5中表单的常用属性及新属性
2016/02/19 HTML / CSS
Myprotein法国官网:欧洲第一运动营养品牌
2019/03/26 全球购物
禁烟标语大全
2014/06/11 职场文书
信访稳定工作汇报
2014/10/27 职场文书
财务部岗位职责
2015/02/03 职场文书
小学少先队活动总结
2015/05/08 职场文书
政审证明范文
2015/06/19 职场文书
安全教育的主题班会
2015/08/13 职场文书
五星级酒店宣传口号
2015/12/25 职场文书
入党转正申请书范文
2019/05/20 职场文书
Python入门学习之类的相关知识总结
2021/05/25 Python
教你用Java在个人电脑上实现微信扫码支付
2021/06/13 Java/Android