Python中往函数中传其他类实例的这种操作规范吗?
比如 Django 中要修改个数据 model 的删除状态。
def delete_instance(model_obj):
model_obj.deleted = True
类似这种写法,model_obj 当然是 Django 中一个 models.Model 的类实例。 我的意见是肯定不能这么写,一来不安全,这个 model_obj 可以进行 model 的所有操作。二来在其他地方调用的时候还需要先 get 到这个 model_obj,复用贼麻烦。但还是说不过同事,哎。
Python中往函数中传其他类实例的这种操作规范吗?
如果不这么弄,函数参数太多怎么办,楼主给个解决方案
在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方法。
这样做的好处:
- 解耦:
Car不负责创建Engine,两者独立。以后想换一个不同类型的引擎(比如电动引擎ElectricEngine),只要它也有start方法,就可以直接传进去,不用改Car的代码。 - 易测试:在给
Car写单元测试时,你可以轻松地传入一个模拟的(Mock)引擎对象,而不是真实的、复杂的Engine实例。
总结:这是一种标准且推荐的做法,能让你的代码更模块化、更灵活。
所以,放心用吧,这是Python的常规操作。
def delete_instance(model_obj): 这个方法直接写在 model 里。
Book.delete_instance(id) ???
**kwargs
哦,那又不想用**kwargs 呢,就是想搞的有点面向对象的意思。。
这是写在工具类里,写在对象上的话,如果这个动作要干一些别的事情,就会依赖倒置。
这不面向对象

