我是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中可继承的正确方法是什么?相关推荐

  1. python文字冒险游戏_模拟射击文字类游戏(Python)

    之前使用java进行一个比较简单的实验--模拟打枪游戏,具体内容就在这里不多说了,以下是python版本,对于python在语法要求上相对其他语言较为松散,所以在编写时遇到了一些坑. 因为单纯以实现为 ...

  2. 【Python】Python语言学习:面向对象编程,类和对象,封装、继承和多态

    这一周Python语言学习,记录如下. 01 面向对象编OOP 1.1 为什么学习和应用OOP? 1 OOP适合更加复杂的需求分析和项目开发. 2 OOP具有更强大的封装能力. 3 OOP相比于面向过 ...

  3. python eel 多线程_利用Eel使JavaScript调用Python程序

    利用Eel使JavaScript调用Python程序 Eel简介 Eel是一个轻量的python桌面GUI开发第三方库, 它使用HTML/JS作为界面开发语言, 但是能够访问所有的python功能, ...

  4. python中自定义错误_在现代Python中声明自定义异常的正确方法?

    在现代Python中声明自定义异常类的正确方法是什么?我的主要目标是遵循其他异常类所具有的任何标准,以便(例如)由捕获异常的任何工具打印出异常中包含的任何额外字符串. 所谓"现代Python ...

  5. python 编程效率_如何有效提升数据分析效率?五大Python技巧

    如何有效提升数据分析效率?相信这是所有数据分析工作者都想解决的问题.本文整理了五大python技巧,分别是Pandas Profiling:使用 Cufflinks 和 Plotly 绘制 Panda ...

  6. python提高运行效率_提高CPU密集型任务执行效率——Python多进程介绍,内附实例代码...

    multiprocessing模块介绍 Python中多线程无法利用多核优势,如果想要充分地使用多核CPU的资源,在python中大部分情况需要使用多进程,Python提供了multiprocessi ...

  7. python工作技巧_能让你工作事半功倍的python小技巧大合集

    导读:Python是目前世界上最流行的编程语言之一.因为: 1. 它容易学习 2. 它用途超广 3. 它有非常多的开源支持(大量的模块和库) 本文作者 Peter Gleeson 是一名数据科学家,日 ...

  8. python字符宽度_使用vars或\uyu dict的Python固定宽度字符串格式__

    我正在做一个Python项目,我希望使用一些快捷方式来帮助格式化字符串中的类数据.更具体地说,我希望能够使用类似于'{a}{b}{c}'.format(**vars(self), [strlen, s ...

  9. python 仪表驱动_技术文章 | 锐视模块化仪器python驱动使用说明

    原标题:技术文章 | 锐视模块化仪器python驱动使用说明 简仪的硬件驱动都是使用C#用统一接口包装的,所有的MACOs都是开放型的,有明确的方法(Methods)和属性(Properties)定义 ...

最新文章

  1. 比特币现金今日价格_比特币现金价格_今日比特币现金价格_06.12 上午 比特币现金价格 6060.87
  2. OpenCV中Mat属性step,step1,elemSize,elemSize1
  3. linux下/var/run目录下.pid文件的作用(文件锁,防止重复启动)
  4. mysql实际应用在哪里_MySQL数据库的实际应用步骤
  5. Linux使用ntpdate和ntpd进行时间同步
  6. 洛谷 3959 宝藏——枚举+状压dp
  7. OpenStack日志搜集分析之ELK
  8. 零基础如何学习C语言
  9. Java proxy 代理
  10. Linux文件颜色所代表的含义
  11. TensorFlow——decay设置
  12. Unreal4 入门
  13. 跨链技术如何破解区块链的可扩展性难题?
  14. 单表代换密码之Caesar密码的代码实现
  15. php五角星十个点坐标,请教:已知五角星的外接圆半径,如何求五角星十个顶点的坐标?(有图? 爱问知识人...
  16. 深入浅出最优化(2) 步长的计算方法
  17. 炸弹人游戏开发系列(2):初步设计
  18. 读取本地文件并打印输出
  19. BUUCTF-Web:[极客大挑战 2019]Upload
  20. 游戏开发- Python语言在游戏开发中的潜力

热门文章

  1. 09hibernate_session_flush
  2. 李开复:一生换四五次工作在21世纪很正常
  3. ORACLE监听器TNS服务不能启动的问题解决(转自:http://www.cnweblog.com/sunGIS/archive/2006/08/21/124117.html)...
  4. 直方图均衡化 原理、流程、公式推导及matlab实现
  5. java 为何 无效_java – 为什么compareTo无效导致Collections.sor...
  6. php mysql交互实例_php基于session实现数据库交互的类实例
  7. 软件测试都需要哪些工具呢?一文带你看清
  8. 在python的解释器中使用函数_浅析Windows 嵌入python解释器的过程
  9. cad怎么卸载干净_CAD无法卸载,又无法安装怎么办?
  10. linux裸分区如何区分,Linux 裸设备基础知识