Python中往函数中传其他类实例的这种操作规范吗?

比如 Django 中要修改个数据 model 的删除状态。

def delete_instance(model_obj):
    model_obj.deleted = True

类似这种写法,model_obj 当然是 Django 中一个 models.Model 的类实例。 我的意见是肯定不能这么写,一来不安全,这个 model_obj 可以进行 model 的所有操作。二来在其他地方调用的时候还需要先 get 到这个 model_obj,复用贼麻烦。但还是说不过同事,哎。


Python中往函数中传其他类实例的这种操作规范吗?

7 回复

如果不这么弄,函数参数太多怎么办,楼主给个解决方案


在Python里,把其他类的实例传给一个函数,这操作非常规范,而且很常用。这其实就是面向对象编程里“组合”和“依赖注入”的基础玩法。

简单说,一个函数或方法接收一个对象作为参数,意味着它只关心这个对象能“做什么”(即它有哪些方法或属性),而不关心这个对象具体是哪个类的实例。这提高了代码的灵活性和可测试性。

举个例子,假设我们有个Engine类和一个Car类,Car需要用到Engine的功能:

class Engine:
    def start(self):
        print("引擎启动...")

class Car:
    def __init__(self, engine):
        self.engine = engine

    def drive(self):
        self.engine.start()
        print("汽车开始行驶")

# 使用
my_engine = Engine()
my_car = Car(my_engine) # 把Engine实例传入Car
my_car.drive()

在这个例子里,Car类的构造函数接收一个engine参数。我们创建了一个Engine的实例my_engine,然后把它传给了Car的构造函数来创建my_car。这样,Car就拥有了一个引擎,可以调用它的start方法。

这样做的好处:

  1. 解耦Car不负责创建Engine,两者独立。以后想换一个不同类型的引擎(比如电动引擎ElectricEngine),只要它也有start方法,就可以直接传进去,不用改Car的代码。
  2. 易测试:在给Car写单元测试时,你可以轻松地传入一个模拟的(Mock)引擎对象,而不是真实的、复杂的Engine实例。

总结:这是一种标准且推荐的做法,能让你的代码更模块化、更灵活。

所以,放心用吧,这是Python的常规操作。

def delete_instance(model_obj): 这个方法直接写在 model 里。
Book.delete_instance(id) ???

**kwargs

哦,那又不想用**kwargs 呢,就是想搞的有点面向对象的意思。。

这是写在工具类里,写在对象上的话,如果这个动作要干一些别的事情,就会依赖倒置。

这不面向对象

回到顶部