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 WSGI的深入理解
Aug 01 Python
python实现浪漫的烟花秀
Jan 30 Python
使用Python和Prometheus跟踪天气的使用方法
May 06 Python
Python搭建Spark分布式集群环境
Jul 05 Python
使用 python pyautogui实现鼠标键盘控制功能
Aug 04 Python
Python生态圈图像格式转换问题(推荐)
Dec 02 Python
基于python求两个列表的并集.交集.差集
Feb 10 Python
jupyter notebook 使用过程中python莫名崩溃的原因及解决方式
Apr 10 Python
Python根据指定文件生成XML的方法
Jun 29 Python
python中pyplot基础图标函数整理
Nov 10 Python
Pytorch 使用tensor特定条件判断索引
Apr 08 Python
Python 批量下载阴阳师网站壁纸
May 19 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/12/21 PHP
php error_log 函数的使用
2009/04/13 PHP
Laravel中使用自己编写类库的3种方法
2015/02/10 PHP
php设计模式之单例模式用法经典示例分析
2019/09/20 PHP
PHP中用Trait封装单例模式的实现
2019/12/18 PHP
Gambit vs CL BO3 第三场 2.13
2021/03/10 DOTA
解密效果
2006/06/23 Javascript
jquery png 透明解决方案(推荐)
2010/08/21 Javascript
网页中CDATA标记的说明
2010/09/12 Javascript
分别用marquee和div+js实现首尾相连循环滚动效果,仅3行代码
2011/09/21 Javascript
StringTemplate遇见jQuery冲突的解决方法
2011/09/22 Javascript
Node.js中使用计时器定时执行函数详解
2014/08/15 Javascript
javascript实现加载xml文件的方法
2015/11/24 Javascript
HTML5游戏引擎LTweenLite实现的超帅动画效果(附demo源码下载)
2016/01/26 Javascript
Node.js通过身份证号验证年龄、出生日期与性别方法示例
2017/03/09 Javascript
Vue响应式原理深入解析及注意事项
2017/12/11 Javascript
Vue+Django项目部署详解
2019/05/30 Javascript
Python 文件读写操作实例详解
2014/03/12 Python
python3序列化与反序列化用法实例
2015/05/26 Python
对变量赋值的理解--Pyton中让两个值互换的实现方法
2017/11/29 Python
Python进程间通信Queue实例解析
2018/01/25 Python
Django中的文件的上传的几种方式
2018/07/23 Python
Python使用装饰器模拟用户登陆验证功能示例
2018/08/24 Python
Django中create和save方法的不同
2019/08/13 Python
Pytorch 实现自定义参数层的例子
2019/08/17 Python
python中对二维列表中一维列表的调用方法
2020/06/07 Python
通过实例了解Python异常处理机制底层实现
2020/07/23 Python
python获取百度热榜链接的实例方法
2020/08/25 Python
如何基于matlab相机标定导出xml文件
2020/11/02 Python
办公室文秘自我鉴定
2013/09/21 职场文书
计算机应用专业自荐信
2014/07/05 职场文书
领导干部对照检查材料
2014/08/24 职场文书
圣诞节开幕词
2015/01/29 职场文书
同事欢送会致辞
2015/07/31 职场文书
初中班主任工作随笔
2015/08/15 职场文书
十大最强飞行系宝可梦,BUG燕上榜,第二是飞行系王者
2022/03/18 日漫