尝试覆盖子类中的属性时,我对此行为有点困惑.

第一个示例设置两个类,Parent和Child. Parent继承自object,而Child继承自Parent.属性a使用属性装饰器定义.调用child.a的setter方法时,会引发AttributeError.

在第二个例子中,通过使用property()函数而不是装饰器,一切都按预期工作.

谁能解释为什么行为不同?此外,是的,我知道不需要Child中的__init__定义.

示例1 – 使用@property

class Parent(object):

def __init__(self):

self._a = 'a'

@property

def a(self):

return self._a

@a.setter

def a(self, val):

self._a = val

class Child(Parent):

def __init__(self):

super(Child, self).__init__()

@property

def a(self):

return super(Child, self).a

@a.setter

def a(self, val):

val += 'Child'

super(Child, self).a = val

p = Parent()

c = Child()

print p.a, c.a

p.a = 'b'

c.a = 'b'

print p.a, c.a

示例1 return – 引发属性错误

a a

Traceback (most recent call last):

File "testsuper.py", line 26, in

c.a = 'b'

File "testsuper.py", line 20, in a

super(Child, self).a = val

AttributeError: 'super' object has no attribute 'a'

示例2 – 使用property()

class Parent(object):

def __init__(self):

self._a = 'a'

def _get_a(self):

return self._a

def _set_a(self, val):

self._a = val

a = property(_get_a, _set_a)

class Child(Parent):

def __init__(self):

super(Child, self).__init__()

def _get_a(self):

return super(Child, self)._get_a()

def _set_a(self, val):

val = val+'Child'

super(Child, self)._set_a(val)

a = property(_get_a, _set_a)

p = Parent()

c = Child()

print p.a, c.a

p.a = 'b'

c.a = 'b'

print p.a, c.a

示例2返回 – 正确工作

a a

b bChild

python私有属性和property装饰器_python – 在使用@property装饰器时在属性的s...相关推荐

  1. python生成器和装饰器_python之yield与装饰器

    防伪码:忘情公子著 python中的yield: 在之前发布的<python之列表解析与生成器>中我们有提到过,生成器所实现的是跟列表解析近似的效果,但是我们不能对生成器做一些属于列表解析 ...

  2. python文件下载速度 装饰器_python学习笔记之---装饰器

    # -*- coding:utf-8 -*- '''示例1: 最简单的函数,表示调用了两次''' def myfunc(): print ("myfunc() called.") ...

  3. python反射、闭包、装饰器_python之闭包、装饰器、生成器、反射

    1. 函数的作用域 1.在函数定义时候就固定,与调用位置无关,在调用的时候返回到函数定义的位置 x=1 #全局作用 def f1(): #整个f1函数是定义阶段 deff2():print(x)ret ...

  4. python类修饰器_Python 中使用类修饰器修饰类方法如何处理 self?

    这个是装饰器类. class PostCache: def __init__(self, func): self.func = func self.redis = redis.StrictRedis( ...

  5. python开发视频播放器_Python使用PyQT制作视频播放器

    最近研究了Python的两个GUI包,Tkinter和PyQT.这两个GUI包的底层分别是Tcl/Tk和QT.相比之下,我觉得PyQT使用起来更加方便,功能也相对丰富.这一篇用PyQT实现一个视频播放 ...

  6. python小说下载器_python 制作网站小说下载器

    基本开发环境 · Python 3.6 · Pycharm 相关模块使用 目标网页分析 输入想看的小说内容,点击搜索 这里会返回很多结果,我只选择第一个 网页数据是静态数据,但是要搜索,是post请求 ...

  7. python制作视频播放器_Python使用PyQT制作视频播放器!专属播放器~

    原标题:Python使用PyQT制作视频播放器!专属播放器~ 最近研究了Python的两个GUI包,Tkinter和PyQT.这两个GUI包的底层分别是Tcl/Tk和QT.相比之下,我觉得PyQT使用 ...

  8. 用python做名片管理器_Python简单的名片管理器

    #coding=utf-8 name=["zhangsan","wangwu","test"] print("*"*40 ...

  9. python中自带的三个装饰器_python三个自带装饰器的功能与使用(@property、@staticmethod、@classmethod)...

    本篇随笔只是记录我对这三个装饰器的理解,可能会有不准确的地方,敬请指出. property装饰器 功能:通过property装饰器控制类的属性的绑定与获取,一般就是给某个属性增加一个验证类型等功能. ...

最新文章

  1. 数据结构第一次作业——抽象数据类型
  2. ECMAScript 6 未来前景
  3. 用 Python 告诉你!最近 24 小时内朋友圈发生了什么
  4. python编写安装脚本_2. 编写安装脚本
  5. Spring MVC对象转换说明
  6. arduino nano 蓝牙_贸泽开售结合蓝牙5.2与USB 2.0的 Nordic Semiconductor nRF52820多协议SoC...
  7. Windows编程的Notification和Message
  8. python类的应用_如何剖析python应用程序的类方法?
  9. GoLand连接Linux子系统远程开发
  10. 选择RDP报表工具的原因
  11. win7计算机重启遇到错误,安装Win7系统过程出现计算机意外地重新启动或遇到错误提示的解决方法...
  12. 电商项目5:商品模块
  13. Eplan创建符号详细解说
  14. concurrent mode failure
  15. 解决ubantu里面报错findfont: Font family ['sans-serif'] not found. Falling back to Bitstream Vera Sans
  16. Android 语音输入API使用
  17. 发人深省 可惜你们忘了他
  18. 碎影录·Freshman In SDU by郝宗铎
  19. 红猫linux系统下载教程,RedCat_NSS_红猫linux软路由安装使用手册
  20. linux从串口接收数据丢失_Linux系统下串口接收数据,部分特殊字符丢失的解决方法...

热门文章

  1. Pod在多可用区worker节点上的高可用部署
  2. Java面向对象----封装概念
  3. Xcode 小技巧:利用 assets 配置针对不同设备的资源
  4. SQL基本点—— 思维导图
  5. (备忘)Java数据类型中String、Integer、int相互间的转换
  6. WCF .net Tcp 错误异常
  7. leetcode002 add_two_numbers
  8. java swf转pdf_doc转pdf和pdf转swf
  9. python创建虚拟环境sublime_如何设置python 虚拟环境 sublime text
  10. python解压zip文件_Python中最快解压zip文件的方法