我有一个完全可以在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__
关于如何解决它的任何想法?
答案 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