python私有属性和property装饰器_python – 在使用@property装饰器时在属性的s...
尝试覆盖子类中的属性时,我对此行为有点困惑.
第一个示例设置两个类,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...相关推荐
- python生成器和装饰器_python之yield与装饰器
防伪码:忘情公子著 python中的yield: 在之前发布的<python之列表解析与生成器>中我们有提到过,生成器所实现的是跟列表解析近似的效果,但是我们不能对生成器做一些属于列表解析 ...
- python文件下载速度 装饰器_python学习笔记之---装饰器
# -*- coding:utf-8 -*- '''示例1: 最简单的函数,表示调用了两次''' def myfunc(): print ("myfunc() called.") ...
- python反射、闭包、装饰器_python之闭包、装饰器、生成器、反射
1. 函数的作用域 1.在函数定义时候就固定,与调用位置无关,在调用的时候返回到函数定义的位置 x=1 #全局作用 def f1(): #整个f1函数是定义阶段 deff2():print(x)ret ...
- python类修饰器_Python 中使用类修饰器修饰类方法如何处理 self?
这个是装饰器类. class PostCache: def __init__(self, func): self.func = func self.redis = redis.StrictRedis( ...
- python开发视频播放器_Python使用PyQT制作视频播放器
最近研究了Python的两个GUI包,Tkinter和PyQT.这两个GUI包的底层分别是Tcl/Tk和QT.相比之下,我觉得PyQT使用起来更加方便,功能也相对丰富.这一篇用PyQT实现一个视频播放 ...
- python小说下载器_python 制作网站小说下载器
基本开发环境 · Python 3.6 · Pycharm 相关模块使用 目标网页分析 输入想看的小说内容,点击搜索 这里会返回很多结果,我只选择第一个 网页数据是静态数据,但是要搜索,是post请求 ...
- python制作视频播放器_Python使用PyQT制作视频播放器!专属播放器~
原标题:Python使用PyQT制作视频播放器!专属播放器~ 最近研究了Python的两个GUI包,Tkinter和PyQT.这两个GUI包的底层分别是Tcl/Tk和QT.相比之下,我觉得PyQT使用 ...
- 用python做名片管理器_Python简单的名片管理器
#coding=utf-8 name=["zhangsan","wangwu","test"] print("*"*40 ...
- python中自带的三个装饰器_python三个自带装饰器的功能与使用(@property、@staticmethod、@classmethod)...
本篇随笔只是记录我对这三个装饰器的理解,可能会有不准确的地方,敬请指出. property装饰器 功能:通过property装饰器控制类的属性的绑定与获取,一般就是给某个属性增加一个验证类型等功能. ...
最新文章
- 数据结构第一次作业——抽象数据类型
- ECMAScript 6 未来前景
- 用 Python 告诉你!最近 24 小时内朋友圈发生了什么
- python编写安装脚本_2. 编写安装脚本
- Spring MVC对象转换说明
- arduino nano 蓝牙_贸泽开售结合蓝牙5.2与USB 2.0的 Nordic Semiconductor nRF52820多协议SoC...
- Windows编程的Notification和Message
- python类的应用_如何剖析python应用程序的类方法?
- GoLand连接Linux子系统远程开发
- 选择RDP报表工具的原因
- win7计算机重启遇到错误,安装Win7系统过程出现计算机意外地重新启动或遇到错误提示的解决方法...
- 电商项目5:商品模块
- Eplan创建符号详细解说
- concurrent mode failure
- 解决ubantu里面报错findfont: Font family ['sans-serif'] not found. Falling back to Bitstream Vera Sans
- Android 语音输入API使用
- 发人深省 可惜你们忘了他
- 碎影录·Freshman In SDU by郝宗铎
- 红猫linux系统下载教程,RedCat_NSS_红猫linux软路由安装使用手册
- linux从串口接收数据丢失_Linux系统下串口接收数据,部分特殊字符丢失的解决方法...
热门文章
- Pod在多可用区worker节点上的高可用部署
- Java面向对象----封装概念
- Xcode 小技巧:利用 assets 配置针对不同设备的资源
- SQL基本点—— 思维导图
- (备忘)Java数据类型中String、Integer、int相互间的转换
- WCF .net Tcp 错误异常
- leetcode002 add_two_numbers
- java swf转pdf_doc转pdf和pdf转swf
- python创建虚拟环境sublime_如何设置python 虚拟环境 sublime text
- python解压zip文件_Python中最快解压zip文件的方法