使用类与正义函数

时间:2018-08-19 03:56:25

标签: python-3.x theory

我将要创建一个通过XML(非常大,.5gb +)进行解析的脚本,并试图考虑如何有效地做到这一点。

通常,我会在AutoIt中执行此操作,因为这是我用于事物的“正常”语言,但是我认为在Python中执行此操作更为合适(此外,我想学习更多python)。

通常,我将如何使用XML创建所有需要的“列”的常量,使用该常量将其匹配并解析为一个数组(实际上是2个数组,是引起子记录的原因),然后将数组集作为JSON对象/字符串传递到记录系统。

在Python中,我不确定这是最佳途径。我正在考虑创建一个对象类,然后为要转换为JSON然后提交的XML的每个记录/行创建实例。如果我有雄心壮志,我​​什至会努力使其成为多线程的。我最好的选择是拔出一条记录,然后在我处理下一条记录时在后台提交,最多5到10条记录,但这也许不好。

我的问题是,看起来我是在使用类只是为了使用类,还是这样做的好理由?我承认我的思想被这样的事实所困扰:我以前没有(经常)使用过很多类,而是因为它整洁而新颖而使用它。

我是否真的有一种更好的方法可以忽略,因为我对新的/闪亮的概念或缺乏程序知识(这可能对我来说)视而不见?

我希望找到能指导我总体方向的答案-这是我学习语言的一部分,而自己进行研究确实可以帮助我了解自己的工作以及原因。不幸的是,我想在这一点上我需要一个指南。

1 个答案:

答案 0 :(得分:1)

此辩论本质上是根据情况而定,将取决于您打算在程序中做什么。我要考虑的主要事情是,我是否需要将属性(数据)功能(方法/功能)封装到一个分组中?

在这种情况下,使用类(对象)的利弊时,还会想到一些其他事情:

使用课程的原因:

  1. 如果将来可能的可维护性需要保证将新类“交换”到程序中的现有结构中。
  2. 是否存在对类的所有实例都适用的属性。
  3. 将一组功能与程序的其余部分分开是合理的。
  4. 用于确保不变性的更简洁的选择
  5. 为基础字段提供类型与程序的其余部分紧密结合。

原因是不使用课程:

  1. 可以完全通过添加新功能来维护代码。
  2. 您不是要在存储的字段上执行功能性任务(例如,存储create_date,但只需要与age一起使用-这样可以更好地将其自身用于没有存储空间的对象公开create_date,而仅仅是一个函数get_age )。
  3. 您必须满足严格的性能优化标准,并且无法证明对函数的调用以确保封装,任何其他内存开销等……

通常,Python是使用类的,因为它是一种面向对象的语言。但是,与诸如C ++和Java之类的更频繁使用的语言相比,您可以在Python中使用更多功能而“逃脱”而不使用类。如果您想使用一堂课来探索,我当然认为这是使用该语言的好练习。

编辑: 基于后续评论,我想提供一个使用命名参数实例化带有可选字段的类的示例。总体概述是,Python在考虑将哪个参数分配给内部功能时会解释参数的顺序。例如:

def get_info(name, birthday, favorite_color):
   age = current_time - birthday
   return [name, age, favorite_color]

在此示例中,Python根据调用方法时出现的顺序解释输入参数:

get_info('James', '03-05-1998', 'blue')

但是,Python还允许使用命名参数,该命名参数明确指定参数内部字段的分配:

get_info(name='James', birthday='03-05-1998', favorite_color='blue')

乍一看,此语法似乎更冗长,但实际上它提供了很大的灵活性,因为命名参数的顺序无关紧要,并且您可以为未传递到方法签名中的参数设置默认值:

def get_info(name, birthday, favorite_color=None):
       age = current_time - birthday
       return [name, age, favorite_color]

get_info(name='James', birthday='03-05-1998')

下面,我提供了一个更深入的工作示例,说明命名参数如何帮助您在评论中概述的情况(许多字段,并非全部都是必填字段)以各种方式构造该对象以了解如何需要非命名参数,但是命名参数是可选的,并且默认为__init__()方法中指定的值:

class Car(object):
    """ Initializes a new Car object. Requires a color, make, model, horsepower, price, and condition.
    Optional parameters include: wheel_size, moon_roof, premium_sound, interior_color, and interior_material."""
    def __init__(self, color, make, model, horsepower, price, condition, wheel_size=16, moon_roof=None, premium_sound=None, interior_color='black', interior_material='cloth'):
        self.color = color
        self.make = make
        self.model = model
        self.horsepower = horsepower
        self.price = price
        self.condition = condition
        self.wheel_size = wheel_size
        self.moon_roof = moon_roof
        self.premium_sound = premium_sound
        self.interior_color = interior_color
        self.interior_material = interior_material

    # Prints attributes of the Car class and their associated values in no specific order.
    def print_car(self):
        fields = []
        for key, value in self.__dict__.iteritems():
            fields.append(key + ': ')
            fields.append(str(value))
            fields.append('\n')
        print ''.join(fields)

# Executes the main program body
def main():
    stock_car = Car('Red', 'Honda', 'NSX', 290, 89000.00, 'New')
    stock_car.print_car()
    custom_car = Car('Black', 'Mitsubishi', 'Lancer Evolution', 280, 45000.00, 'New', 17, "Tinted Moonroof", "Bose", "Black/Red", "Suede/Leather")
    custom_car.print_car()

# Calls main() as the entry point for this program.
if __name__ == '__main__':
    main()