我应该在这里使用一个类:使用lxm读取XML文件吗

2024-04-25 23:38:31 发布

您现在位置:Python中文网/ 问答频道 /正文

这个问题是我上一个问题的延续,在这个问题中我问了passing around an ElementTree.

我只需要读取XML文件,为了解决这个问题,我决定创建一个全局ElementTree,然后根据需要解析它。你知道吗

我的问题是:

这是可以接受的做法吗?我听说global变量不好。如果我不做global,有人建议我做一个class。但是我真的需要创建一个class?这种方法对我有什么好处。注意,每次运行我只处理一个ElementTree实例,操作是只读的。如果我不使用class,我应该如何和在哪里声明ElementTree,以便它在全局可用?(请注意,我将导入此模块)

请回答这个问题,因为我是一个开发初学者,在这个阶段我不知道是使用类还是只使用函数式编程方法。你知道吗


Tags: 模块文件实例方法an声明xml全局
3条回答

全局变量坏的原因有很多。首先,它让你养成了声明全局变量的习惯,这不是一个好的做法,尽管在某些情况下全局变量是有意义的,例如PI。当您有意或意外地在本地重复使用名称时,Globals也会产生问题。或者更糟的是,当你认为你在本地使用这个名字,但实际上你在给这个全局变量赋值。这个特定的问题依赖于语言,python在不同的情况下处理它的方式也不同。你知道吗

class A:
   def __init__(self):
      self.name = 'hi'

x = 3
a = A()

def foo():
   a.name = 'Bedevere'
   x = 9

foo()
print x, a.name #outputs 3 Bedevere

创建一个类并传递你的类的好处是你将得到一个定义的、恒定的行为,特别是因为你应该调用类方法,这些方法对类本身进行操作。你知道吗

class Knights:
   def __init__(self, name='Bedevere'):
       self.name = name
   def knight(self):
       self.name = 'Sir ' + self.name
   def speak(self):
       print self.name + ":", "Run away!"

class FerociousRabbit:
   def __init__(self):
       self.death = "awaits you with sharp pointy teeth!"
   def speak(self):
       print "Squeeeeeeee!"

def cave(thing):
   thing.speak()
   if isinstance(thing, Knights):
       thing.knight()

def scene():
   k = Knights()
   k2 = Knights('Launcelot')
   b = FerociousRabbit()
   for i in (b, k, k2):
      cave(i)

这个例子说明了一些好的原则。首先,python在调用函数时的优势——凶猛的兔子和骑士是两个不同的类,但它们有相同的函数speak()。在其他语言中,为了做这样的事情,它们至少必须有相同的基类。您希望这样做的原因是它允许您编写一个函数(cave),可以对任何具有“speak()”方法的类进行操作。您可以创建任何其他方法并将其传递给cave函数:

class Tim:
   def speak(self):
       print "Death awaits you with sharp pointy teeth!"

因此,在您的例子中,当处理elementTree时,假设以后某个时候您还需要开始解析apache日志。如果你在做纯功能性的程序,你基本上是被套住了。您可以修改和扩展当前的程序,但是如果您编写的函数很好,您只需在混合中添加一个新类(技术上)就可以了。你知道吗

实际上,您的代码是否有望增长?尽管人们认为OOP是正确的方法,但我发现有时候称重更好成本:收益(s) 每当你重构一段代码时。如果您希望扩展这个功能,那么OOP是一个更好的选择,因为您可以扩展和定制任何未来的用例,同时避免在代码维护中浪费不必要的时间。否则,如果它没坏,就别修了,伊莫。你知道吗

当我屈服于给出一个模块的诱惑时,我通常会感到后悔,例如,一个load\u file()方法,该方法设置了一个全局变量,该模块的其他函数可以使用它来查找它们应该谈论的文件。例如,它使测试变得更加困难,一旦我需要两个XML文件,就会出现问题。另外,每个函数都需要检查文件是否存在,如果不存在则给出一个错误。你知道吗

如果我想实现函数化,我只需要让每个函数都将XML文件作为参数。你知道吗

如果我想成为面向对象的,我将有一个MyXMLFile类,它的方法只需查看self.xml文件或者别的什么。你知道吗

当只有一个东西(如文件)要传递时,这两种方法或多或少是等效的;但是当“状态”中的东西的数量大于几个时,我发现类更简单,因为我可以将所有这些东西都放在类中。你知道吗

(我在回答你的问题吗?我还不清楚你想要什么样的答案。)

相关问题 更多 >