在处理之前,我尝试使用__new__
方法检查参数有效性(str),因此我执行以下操作:
class foo:
def __new__(cls, argument):
if not isinstance(argument, str):
raise TypeError('argument must be str')
print("passed __new__")
def __init__(self, argument):
self.argument = argument
print("passed __init__")
def __enter__(self):
print("passed __enter__")
def __exit__(self, *args):
print("passed __exit__")
with
关键字调用它时,它调用__enter__
和__exit__
with foo('test'):
print("i am between __enter__ and __exit__, damn!")
passed __new__
AttributeError: __enter__
passed __new__
passed __init__
passed __enter__
i am between __enter__ and __exit__, damn!
passed __exit__
我注意到当完全删除__new__
方法时;它会起作用的。为什么使用__new__
会破坏这一点?即使存在__new__
,我如何让它工作
__new__
必须实际创建并返回类的实例在原始代码中,
foo.__new__
返回了None
,实际上None
没有属性__enter__
。另外,由于None
不是foo
的实例,对foo.__init__
的隐式调用被抑制因为
foo
是type
的实例,所以调用foo('test')
是可以想象
__call__
的定义如下重写
__new__
意味着您希望更改实例如何创建,而重写__init__
意味着您希望更改已创建实例如何初始化。在这种情况下,如果参数的类型错误,可以避免创建新实例相关问题 更多 >
编程相关推荐