当前位置:  开发笔记 > 编程语言 > 正文

Python OO程序结构规划

如何解决《PythonOO程序结构规划》经验,为你挑选了1个好方法。

我是OOP的初学者,我想创建一个包含三个类A,B和C的程序.该类的每个实例都由一组特征Achar1,Achar2等定义.

该程序应该创建包含A元素,B元素和C元素的用途,包括开始和结束日期.有A和B的子类,因此A的某些元素只能连接到B的某些元素.该程序的主要功能是列出A,B和C的元素及其属性,列表用途和建议新用途这样可以最大限度地减少类的实例,以避免重复.

我的第一直觉是使用三个词典A,B和C以及一个字典供用.这似乎直观,易于导入/导出到json或类似.我试图重写它来使用类,但是我看不出这样做的任何好处:迭代类的实例很难(?)它们基本上都是字典,因为这些数据不需要太多其他内容.

我究竟做错了什么?从字典切换到对象可以获得什么?

编辑:有问题的代码(基于字典)在这里.我尝试使其面向对象的第一个版本就在这里.



1> Right leg..:

从字典切换到对象可以获得什么?

这是一个非常广泛的问题.

在Python中,一个对象在语义上等同于一个字典是对的,因为一个对象几乎等同于它的__dict__属性(我不会在这里"几乎"详细说明这个,因为它远离主题).

我看到使用类而不是字典有两个主要好处:抽象和舒适.

抽象化

当您处于设计阶段时,特别是对于中短程序,您通常希望在思考时编写代码的框架.

在你需要建模交互的情况下,在课堂上思考更自然,因为它在说话和编程之间.

这使您更容易理解自己的问题.此外,它极大地提高了代码的可读性,因为它看起来很自然,即使读者对代码一无所知也是如此.

这为您带来了继承和多态等概念,丰富了OOP提供的抽象.

安慰

Python的众多优势之一是它的数据模型.丰富的魔术方法和属性允许您使用非常简单的语法.此外,它可以在您的位置处理一些操作.

以下是Python中命令式和面向对象编程之间的一些比较.

当然,Python中的所有内容都是一个对象,所以foo.bar()即使在命令式示例中我也会使用dot调用().

文件阅读

势在必行

f1 = open(in_path, 'r')
f2 = open(out_path, 'w')
for line in f1:
    processed = process(line)
    f2.write(processed)

# Oops, I forgot to close my files...

面向对象的方式

with open(in_path, 'r') as f1, open(out_path, 'w') as f2:    
    for line in f1:
        processed = process(line)
        f2.write(processed)

# I don't have to close my files, Python did it for me

请注意,这for line in f是Python面向对象数据模型的广泛使用.想象一下,如果这种语法不存在会很痛苦(好吧,只需在C中尝试).

空虚测试

势在必行

if len(some_list) == 0:
    print("empty list")

面向对象的方式

if some_list:
    print("empty list")

迭代序列

势在必行

i = 0
while i < len(some_sequence):
    print(some_sequence[i])
    i += 1

面向对象的方式

for elt in some_sequence:
    print(elt)

但是这个数据模型的实际优势在于它可以让你重新定义很多魔法属性.举例来说,你可以通过实现让复杂的事情相媲美__lt__,__le__等等,这将重新定义的行为<,<=等.从那时起,如内置的功能min,maxsort将了解如何比较你的对象.

这就是说,在各种各样的情况下使用单纯的词典就足够了.

在一天结束时,OOP只是一种范式,而命令式编程只是运作良好.

推荐阅读
小色米虫_524
这个屌丝很懒,什么也没留下!
DevBox开发工具箱 | 专业的在线开发工具网站    京公网安备 11010802040832号  |  京ICP备19059560号-6
Copyright © 1998 - 2020 DevBox.CN. All Rights Reserved devBox.cn 开发工具箱 版权所有