python oop 继承_关于oop:使类数据在python中可继承的正确方法是什么?
我是Python的新手,来自Perl领域。
我正在尝试确定关于类数据的存储和访问的最佳实践,以便它可以被子类继承并可能进行扩展。阅读Python 2.7文档(我确实使用2.6),深入研究Python和此处的过去问题,答案尚不清楚。
在python伪代码中,类似...
class baseClass:
'DataMap' = {
'key1': 'val1',
'key2': 'val2',
'key3': 'val2',
}
class subClass1(baseClass): # has access to DataMap
def myfunc:
...
if DataMap[x] == 'val2':
print 'foo' # if x equals 'key2' according to the data map
y = DataMap['key4'] # error!
...
class subClass2(baseClass): # appends values to base DataMap
DataMap['key4'] = 'val4'
def myfunc:
...
if DataMap[x] == 'val4':
print 'foo' # if x equals 'key4' according to the data map
elif DataMap[x] == 'val2':
print 'bar' # if x equals 'key2' according to the data map
...
我在上面写的内容有点让Perl想到,直接类数据访问是常见的,并且由于调用方法的开销而受到大多数鼓励。我感觉这种方法虽然不是很Python,但是我想进行一次健全性检查。
DataMap是否应该驻留在一个类函数中,尽管该类一旦编译后就不会改变,那么当继承BaseClass和subClass2时,subClass1可以通过一个类方法获取该数据,而subClass2可以覆盖同一方法以将其datamap与base附加/合并。
感谢您的见解和智慧。
如果您定义:
class baseClass:
DataMap = {
'key1': 'val1',
'key2': 'val2',
'key3': 'val2',
}
然后baseClass.__dict__包含'DataMap': {'key3': 'val2', 'key2': 'val2', 'key1': 'val1'}。
这使得不可能涉及DataMap是类继承,因为如果稍后定义
class subClass2(baseClass): # appends values to base DataMap
DataMap = {'key4':'val4'}
那么subClass2.__dict__就有自己的与键'DataMap'竞争的条目。
如果s = subClass2()是subClass2的实例,则s.DataMap将仅访问subClass2.__dict__中的DataMap,并且在找到它时将永远不会在baseClass.__dict__中查找。因此不会发生继承。
您可以在subClass2中修改baseClass.__dict__,但这会违反OOP原则,因为子类不应修改其父类。而且无论如何这都不是继承,因为对baseClass.__dict__的更改将影响baseClass的所有实例以及使用其DataMap的所有子类。
也许可以通过子类化DataMap本身来实现所需的功能:
class DataMap(object):
key1='val1'
key2='val2'
key3='val2'
class subDataMap(DataMap):
key4='val4'
class baseClass(object):
dataMap=DataMap
class subClass1(baseClass):
def myfunc(self,x):
val=getattr(self.dataMap,x)
if val == 'val2':
print 'foo'
class subClass2(baseClass):
dataMap=subDataMap
def myfunc(self,x):
val=getattr(self.dataMap,x)
if val == 'val4':
print 'foo'
elif val == 'val2':
print 'bar'
s=subClass1()
s.myfunc('key2')
# foo
try:
s.myfunc('key4')
except AttributeError as err:
print(err)
# subClass1 instance has no attribute 'key4'
s2=subClass2()
s2.myfunc('key2')
# bar
s2.myfunc('key4')
# foo
我在示例中展示了一个DataMap,但实际上我正在查看出于各种目的应由所有对象共享的多个数据图。 我认为在我的"真实世界"中,这种解决方案会变得混乱吗?
@tima:是的; 它会变得凌乱。 在那种情况下,要使用类属性并获得继承的好处,我认为最好使DataMap成为一个类,并通过子类化DataMap将新的键值添加到数据映射中。
众所周知,将像dict这样的可变对象用作默认参数,或者在诸如__init__方法之类的东西之外使用行为,可能不会像您认为的那样起作用。
作为一个简单的例子:
class A(object):
a = {'foo':1}
a = A()
a.a['bar'] = 2
b = A()
print b.a
因此,即使您希望b.a只是{'foo':1},b.a还是{'foo': 1, 'bar': 2}
因此,通常将可变数据放入类的__init__函数中。例如。
class A(object):
def __init__(self):
self.a = {'foo':1}
a = A()
a.a['bar'] = 2
b = A()
print b.a
是的,您的第一个示例不像我想的那样有效。 我希望拥有该类的所有对象共享的不可变数据集。 第二个示例是为每个不必要的对象实例创建数据副本。
python oop 继承_关于oop:使类数据在python中可继承的正确方法是什么?相关推荐
- python文字冒险游戏_模拟射击文字类游戏(Python)
之前使用java进行一个比较简单的实验--模拟打枪游戏,具体内容就在这里不多说了,以下是python版本,对于python在语法要求上相对其他语言较为松散,所以在编写时遇到了一些坑. 因为单纯以实现为 ...
- 【Python】Python语言学习:面向对象编程,类和对象,封装、继承和多态
这一周Python语言学习,记录如下. 01 面向对象编OOP 1.1 为什么学习和应用OOP? 1 OOP适合更加复杂的需求分析和项目开发. 2 OOP具有更强大的封装能力. 3 OOP相比于面向过 ...
- python eel 多线程_利用Eel使JavaScript调用Python程序
利用Eel使JavaScript调用Python程序 Eel简介 Eel是一个轻量的python桌面GUI开发第三方库, 它使用HTML/JS作为界面开发语言, 但是能够访问所有的python功能, ...
- python中自定义错误_在现代Python中声明自定义异常的正确方法?
在现代Python中声明自定义异常类的正确方法是什么?我的主要目标是遵循其他异常类所具有的任何标准,以便(例如)由捕获异常的任何工具打印出异常中包含的任何额外字符串. 所谓"现代Python ...
- python 编程效率_如何有效提升数据分析效率?五大Python技巧
如何有效提升数据分析效率?相信这是所有数据分析工作者都想解决的问题.本文整理了五大python技巧,分别是Pandas Profiling:使用 Cufflinks 和 Plotly 绘制 Panda ...
- python提高运行效率_提高CPU密集型任务执行效率——Python多进程介绍,内附实例代码...
multiprocessing模块介绍 Python中多线程无法利用多核优势,如果想要充分地使用多核CPU的资源,在python中大部分情况需要使用多进程,Python提供了multiprocessi ...
- python工作技巧_能让你工作事半功倍的python小技巧大合集
导读:Python是目前世界上最流行的编程语言之一.因为: 1. 它容易学习 2. 它用途超广 3. 它有非常多的开源支持(大量的模块和库) 本文作者 Peter Gleeson 是一名数据科学家,日 ...
- python字符宽度_使用vars或\uyu dict的Python固定宽度字符串格式__
我正在做一个Python项目,我希望使用一些快捷方式来帮助格式化字符串中的类数据.更具体地说,我希望能够使用类似于'{a}{b}{c}'.format(**vars(self), [strlen, s ...
- python 仪表驱动_技术文章 | 锐视模块化仪器python驱动使用说明
原标题:技术文章 | 锐视模块化仪器python驱动使用说明 简仪的硬件驱动都是使用C#用统一接口包装的,所有的MACOs都是开放型的,有明确的方法(Methods)和属性(Properties)定义 ...
最新文章
- 比特币现金今日价格_比特币现金价格_今日比特币现金价格_06.12 上午 比特币现金价格 6060.87
- OpenCV中Mat属性step,step1,elemSize,elemSize1
- linux下/var/run目录下.pid文件的作用(文件锁,防止重复启动)
- mysql实际应用在哪里_MySQL数据库的实际应用步骤
- Linux使用ntpdate和ntpd进行时间同步
- 洛谷 3959 宝藏——枚举+状压dp
- OpenStack日志搜集分析之ELK
- 零基础如何学习C语言
- Java proxy 代理
- Linux文件颜色所代表的含义
- TensorFlow——decay设置
- Unreal4 入门
- 跨链技术如何破解区块链的可扩展性难题?
- 单表代换密码之Caesar密码的代码实现
- php五角星十个点坐标,请教:已知五角星的外接圆半径,如何求五角星十个顶点的坐标?(有图? 爱问知识人...
- 深入浅出最优化(2) 步长的计算方法
- 炸弹人游戏开发系列(2):初步设计
- 读取本地文件并打印输出
- BUUCTF-Web:[极客大挑战 2019]Upload
- 游戏开发- Python语言在游戏开发中的潜力
热门文章
- 09hibernate_session_flush
- 李开复:一生换四五次工作在21世纪很正常
- ORACLE监听器TNS服务不能启动的问题解决(转自:http://www.cnweblog.com/sunGIS/archive/2006/08/21/124117.html)...
- 直方图均衡化 原理、流程、公式推导及matlab实现
- java 为何 无效_java – 为什么compareTo无效导致Collections.sor...
- php mysql交互实例_php基于session实现数据库交互的类实例
- 软件测试都需要哪些工具呢?一文带你看清
- 在python的解释器中使用函数_浅析Windows 嵌入python解释器的过程
- cad怎么卸载干净_CAD无法卸载,又无法安装怎么办?
- linux裸分区如何区分,Linux 裸设备基础知识