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 continue语句用法实例
Mar 11 Python
Python实现方便使用的级联进度信息实例
May 05 Python
Python同时向控制台和文件输出日志logging的方法
May 26 Python
python实现web方式logview的方法
Aug 10 Python
python基于隐马尔可夫模型实现中文拼音输入
Apr 01 Python
解析Python中的生成器及其与迭代器的差异
Jun 20 Python
python异步存储数据详解
Mar 19 Python
Python正则表达式匹配和提取IP地址
Jun 06 Python
python使用opencv对图像mask处理的方法
Jul 05 Python
Django处理Ajax发送的Get请求代码详解
Jul 29 Python
Python Django 实现简单注册功能过程详解
Jul 29 Python
Python实现的爬取豆瓣电影信息功能案例
Sep 15 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
mysql+php分页类(已测)
2008/03/31 PHP
php文件上传的简单实例
2013/10/19 PHP
从零开始学YII2框架(一)通过Composer安装Yii2框架
2014/08/20 PHP
php获取随机数组列表的方法
2014/11/13 PHP
thinkphp实现上一篇与下一篇的方法
2014/12/08 PHP
PHP curl CURLOPT_RETURNTRANSFER参数的作用使用实例
2015/02/07 PHP
PHP实现统计所有字符在字符串中出现次数的方法
2017/10/17 PHP
Thinkphp5行为使用方法汇总
2017/12/21 PHP
阿里对象存储OSS在laravel框架中的使用方法
2019/10/13 PHP
实例分析js和C#中使用正则表达式匹配a标签
2014/11/26 Javascript
JS构造函数与原型prototype的区别介绍
2016/07/04 Javascript
jQuery自制提示框tooltip改进版
2016/08/01 Javascript
JavaScript中对象的不同创建方法
2016/08/12 Javascript
详谈AngularJs 控制器、数据绑定、作用域
2017/07/09 Javascript
基于Bootstrap的标签页组件及bootstrap-tab使用说明
2017/07/25 Javascript
AngularJS实现的获取焦点及失去焦点时的表单验证功能示例
2017/10/25 Javascript
深入研究React中setState源码
2017/11/17 Javascript
vue实现消息的无缝滚动效果的示例代码
2017/12/05 Javascript
Python3中的2to3转换工具使用示例
2015/06/12 Python
基于Python的关键字监控及告警
2017/07/06 Python
Python基于lxml模块解析html获取页面内所有叶子节点xpath路径功能示例
2018/05/16 Python
python和mysql交互操作实例详解【基于pymysql库】
2019/06/04 Python
关于django 1.10 CSRF验证失败的解决方法
2019/08/31 Python
Python导入数值型Excel数据并生成矩阵操作
2020/06/09 Python
Java Unsafe类实现原理及测试代码
2020/09/15 Python
python批量修改文件名的示例
2020/09/27 Python
Python命令行参数argv和argparse该如何使用
2021/02/08 Python
CSS3绘制有活力的链接下划线
2016/07/14 HTML / CSS
荷兰在线体育用品商店:Avantisport.nl
2018/07/04 全球购物
信息专业大学生自我评价分享
2014/01/17 职场文书
企业文化演讲稿
2014/05/20 职场文书
签约仪式策划方案
2014/06/02 职场文书
爱心捐书活动总结
2014/07/05 职场文书
转让协议书范本
2014/09/13 职场文书
农民工预备党员思想汇报
2014/09/14 职场文书
Java中生成微信小程序太阳码的实现方案
2022/06/01 Java/Android