python3

时间:2019-12-06 20:45:18

标签: python-3.x

我有一个完全可以在Python 2中运行的代码,但是在Python 3中却无法运行。

有一个聚合器类data和一些用于特定数据格式的类。

class data():
   def __init__(self, file, format="x"):
      if format == "x":
         self.data = xdata(file)
      elif format == "y":
         self.data = ydata(file)
      # Redirect functions to the specific class
      self.__enter__       = self.data.__enter__
      self.__exit__        = self.data.__exit__
class xdata():
   def __init__(self, file):
      #do something
   def __enter__(self):
      return self
   def __exit__(self, exc_type, exc_value, traceback):
      #do something

class ydata():
   def __init__(self, file):
      #do something
   def __enter__(self):
      return self
   def __exit__(self,exc_type, exc_value, traceback):
      #do something

在python2中,我能够执行以下代码而没有任何错误,

with data("newfile.x") as sd:
    #do something with data

但是python3返回错误AttributeError: __enter__

关于如何解决它的任何想法?

1 个答案:

答案 0 :(得分:1)

__enter____exit__将被解析为描述符,这意味着解析会绕过该类的属性。您可以使用__enter____exit__property提供自己的描述符:

class xdata():
   def __init__(self, file):
      self.attr = 'x'
   def __enter__(self):
      return self
   def __exit__(self, exc_type, exc_value, traceback):
      pass

class ydata():
   def __init__(self, file):
      self.attr = 'y'
   def __enter__(self):
      return self
   def __exit__(self, exc_type, exc_value, traceback):
      pass

class data():
   def __init__(self, file, format="x"):
      if format == "x":
         self.data = xdata(file)
      elif format == "y":
         self.data = ydata(file)
      # Redirect functions to the specific class
   @property
   def __enter__(self):
      return self.data.__enter__
   @property
   def __exit__(self):
      return self.data.__exit__

with data("", "x") as d:
   print(d.attr)  # x

with data("", "y") as d:
   print(d.attr)  # y