python class如何终止方法执行?

class test:
   def __init__(self, tag):
      print(tag)
      if tag=='err' :return False

   def print(self,text):
      print(text)

test('okokoko').print('12345')
test('err').print('12345')#怎么让这句执行正确?

执行
test(‘err’).print(‘12345’)
会返回错误
TypeError: init() should return None, not ‘bool’

class test:
    def __init__(self, tag):
        self.tag=tag
        print(tag)

    def print(self,text):
        if self.tag=='err':return False
        print(text)

test('err').print('12345')

这样可以正确执行,但是有个问题就是如果方法有很多的话,每个方法都要加一句
if self.tag==’err’:return False
感觉太麻烦了

Jason990420
最佳答案

Here’s my way to go …

[Edit] 旧代码读取实例的属性值会出现不適當的值, 修改代码 (假设属性值也会失效).

class Test:

    def __init__(self, tag):
        self.tag=tag

    def print(self,text):
        print(text)

    def __getattribute__(self, name):
        if object.__getattribute__(self, "tag") == 'err':
            if callable(object.__getattribute__(self, name)):
                return lambda *args, **kwargs: None
            else:
                return None
        return object.__getattribute__(self, name)
>>> Test('err').print('12345')
>>> Test('err').tag
>>> Test('good').print('12345')
12345
>>> Test('good').tag
'good'
3年前 评论
heavenm (楼主) 3年前
讨论数量: 3
Jason990420

Here’s my way to go …

[Edit] 旧代码读取实例的属性值会出现不適當的值, 修改代码 (假设属性值也会失效).

class Test:

    def __init__(self, tag):
        self.tag=tag

    def print(self,text):
        print(text)

    def __getattribute__(self, name):
        if object.__getattribute__(self, "tag") == 'err':
            if callable(object.__getattribute__(self, name)):
                return lambda *args, **kwargs: None
            else:
                return None
        return object.__getattribute__(self, name)
>>> Test('err').print('12345')
>>> Test('err').tag
>>> Test('good').print('12345')
12345
>>> Test('good').tag
'good'
3年前 评论
heavenm (楼主) 3年前

实现逻辑: 当tag等于’err’的时候,类实例所有方法以及属性均不可使用。
实现方法:在创建实例前,判断tag的值,当等于err的时候返回一个没有任何自定义属性的类对象,并添加__getattr__处理找不到属性的异常情况。

class Base(abc.ABC):
    def __init__(self, *args, **kwargs):
        """"""
    def __getattr__(self, item):
        """处理属性找不到的情况"""
        return lambda *args, **kwargs: None  # 返回一个可以调用的对象

class Test:
    def __new__(cls, *args, **kwargs):
        if args[0] == 'err':
            tempClass = type("tempTest", (Base,), {})
            return tempClass(*args, **kwargs)
        return super().__new__(cls)

    def __init__(self, tag):
        self.tag = tag

    def print(self, text):
        print(text)

吐槽:直接在实例化类之前判断tag的值不行吗?等于err,就不要实例化类了。
如果你要实现tag等于err的时候,类的方法部分可用,部分不可用,还是要写很多判断条件的。。。

3年前 评论
pardon110

__init__是py的魔术方法,类似其它语言的构造函数,方法体内无需返回,默认返回实例。

3年前 评论

讨论应以学习和精进为目的。请勿发布不友善或者负能量的内容,与人为善,比聪明更重要!