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如何实现excel数据添加到mongodb
Jul 30 Python
对python的文件内注释 help注释方法
May 23 Python
学习python分支结构
May 17 Python
set在python里的含义和用法
Jun 24 Python
Python3+Appium实现多台移动设备操作的方法
Jul 05 Python
Python使用tkinter模块实现推箱子游戏
Oct 08 Python
使用Keras构造简单的CNN网络实例
Jun 29 Python
一文详述 Python 中的 property 语法
Sep 01 Python
总结python 三种常见的内存泄漏场景
Nov 20 Python
Python函数中apply、map、applymap的区别
Nov 27 Python
Python机器学习应用之工业蒸汽数据分析篇详解
Jan 18 Python
Python测试框架pytest高阶用法全面详解
Jun 01 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
apache2.2.4+mysql5.0.77+php5.2.8安装精简
2009/04/29 PHP
php MsSql server时遇到的中文编码问题
2009/06/11 PHP
深入理解PHP原理之异常机制
2010/08/21 PHP
PHP中通过加号合并数组的一个简单方法分享
2011/01/27 PHP
PHP将字符分解为多个字符串的方法
2014/11/22 PHP
自制PHP框架之模型与数据库
2017/05/07 PHP
javascript 面向对象 function类
2010/05/13 Javascript
JQuery实现表格中相同单元格合并示例代码
2013/06/26 Javascript
jquery eval解析JSON中的注意点介绍
2013/08/23 Javascript
javascript类型转换使用方法
2014/02/08 Javascript
JS获取表格内指定单元格html内容的方法
2015/03/31 Javascript
学习JavaScript设计模式(单例模式)
2015/11/26 Javascript
jQuery validate+artdialog+jquery form实现弹出表单思路详解
2016/04/18 Javascript
实例详解jQuery的无new构建
2016/08/02 Javascript
jquery注册文本框获取焦点清空,失去焦点赋值的简单实例
2016/09/08 Javascript
JS控制div跳转到指定的位置的几种解决方案总结
2016/11/05 Javascript
Vue实现底部侧边工具栏的实例代码
2018/09/03 Javascript
微信小程序学习笔记之登录API与获取用户信息操作图文详解
2019/03/29 Javascript
js设计模式之单例模式原理与用法详解
2019/08/15 Javascript
2020京东618叠蛋糕js脚本(亲测好用)
2020/06/02 Javascript
浅谈Vue static 静态资源路径 和 style问题
2020/11/07 Javascript
[01:03:13]VG vs Pain 2018国际邀请赛小组赛BO2 第一场 8.18
2018/08/19 DOTA
浅谈插入排序算法在Python程序中的实现及简单改进
2016/05/04 Python
Python 数值区间处理_对interval 库的快速入门详解
2018/11/16 Python
python使用for循环计算0-100的整数的和方法
2019/02/01 Python
keras的siamese(孪生网络)实现案例
2020/06/12 Python
python修改微信和支付宝步数的示例代码
2020/10/12 Python
python3字符串输出常见面试题总结
2020/12/01 Python
利用CSS3的定位页面元素
2009/08/29 HTML / CSS
美国椅子和沙发制造商:La-Z-Boy
2020/10/25 全球购物
装饰活动策划方案
2014/02/11 职场文书
学校门卫岗位职责
2014/03/16 职场文书
离婚协议书怎么写
2014/09/12 职场文书
2016年校园社会综合治理宣传月活动总结
2016/03/16 职场文书
Android开发之底部导航栏的快速实现
2022/04/28 Java/Android