python - 如果在 __init__() 中不满足条件,则不要创建对象

标签 python python-3.x oop

我有一个映射数据库对象的类

class MyObj:
    def __init__(self):
        ...SQL request with id as key...
        if len(rows) == 1:
            ...maps columns as my_obj attributes...
            self.exists = True
        else:
            self.exists = False

通过这样的设计,每次都会创建一个对象,我们会使用 .exists 属性检查它是否存在于数据库中。

my_obj = MyObj(id=15)
if my_obj.exists:
    ...do stuff...

它有效。

但我怀疑有更简洁的初始化方法,我们只需要这样检查:

 my_obj = MyObj(id=15)
 if my_obj:
     ...do stuff...

最佳答案

您不能在 __init__ 中执行此操作,因为该方法是在创建新实例之后运行的。

可以object.__new__()来做然而,这首先是为了创建实例而运行的。因为它通常应该返回那个新实例,所以您也可以选择返回其他东西(比如None)。

你可以这样使用它:

class MyObj:
    def __new__(cls, id):
        # ...SQL request with id as key...
        if not rows:
            # no rows, so no data. Return `None`.
            return None

        # create a new instance and set attributes on it
        instance = super().__new__(cls)  # empty instance
        instance.rows = ...
        return instance

关于python - 如果在 __init__() 中不满足条件,则不要创建对象,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/44139867/

相关文章:

Python - 使用列表创建字典

python - 如何用不同的数字重命名python中的文件?

python - 抽象基类不强制执行函数实现

python - 是否可以在实例初始化时向现有对象添加新方法?

python - 需要检查容器是否在运行

python - 打印时出现UnicodeEncodeError

Python:将 pandas 导入到主模块和模块中?

python - mypy错误,Union/Optional重载, “Overloaded function signatures 1 and 2 overlap with incompatible return types”

java - 如何在一个子类的不同方法中调用父类(super class)的几个对象?

java - 使类抽象与使构造函数私有(private)