Python中self的用法详解,或者总是提示:TypeError: add() missing 1 required positional argument: 'self'的问题解决

最近在学习Python的过程中一直发现一个问题,就是在从网上看别人写的一些实例或者一些开源项目的时候,发现一个问题。在调用一个类或者一个类方法的时候,总是提示缺少传递的参数。自己写了一个简单的类似问题,如下:

class Add():

    def add(self):
        return None

if __name__ == '__main__':

    print(Add.add())

这个时候其实我们将add(self)中的self删除后,发现系统报错了

这个时候继续修改,改为add(str1),然后调用的时候给他传递一个字符串,也是没问题的

其实这种写法是存在问题的,首先print(Add.add('aaa')),其实这个类并没有实例化,我们在用的时候应该写成print(Add().add('aaa')),然后继续修改为print(Add().add('aaa')),修改后运行发现又报错了

提示需要一个但是传递了两个参数,因为def add(str1)就等同于def add(self),而self又代表他本身的实例。但是在调用的时候add(‘aaa’)又给他传了一个参数,等同于add(‘self’,‘aaa’)所以也会报错。然后继续修改,完全正确的写法。

所以总结:在我们定义函数和类的时候,在第一个参数的位置默认应该添加self,例如add(self,str,str1),然后我们在调用的时候应该首先实例化这个类,如Add().add('aaa'),而非直接调用Add.add('aaa')。

下面总结一下self的用法详解,大家可以访问https://blog.youkuaiyun.com/CLHugh/article/details/75000104,可以针对平时踩过的坑更深入的了解下。



 

### 解决方案 在 Python 的异步编程中,`async_generator` 是一种特殊的生成器对象,它无法像传统生成器那样被迭代。因此,在 Django 流式响应或其他场景下直接使用 `async_generator` 可能会引发 `TypeError: 'async_generator' object is not iterable` 错误[^1]。 为了处理此问题并使 `async_generator` 能够与同步环境兼容,可以采用以下方法: #### 创建自定义装饰器以支持流式响应 可以通过编写一个装饰器来封装 `async_generator` 并将其转换为可迭代的对象。以下是实现的一个具体示例: ```python import asyncio from django.http import StreamingHttpResponse def stream(coroutine): """将异步生成器适配为可用于StreamingHttpResponse的可迭代对象""" class SyncIterator: def __init__(self, coro): self.coro = coro self.iter = None def __iter__(self): return self def __next__(self): loop = asyncio.new_event_loop() try: chunk = loop.run_until_complete(self.coro.__anext__()) return chunk except StopAsyncIteration: raise StopIteration finally: loop.close() async def wrapper(*args, **kwargs): gen = coroutine(*args, **kwargs) return SyncIterator(gen) return wrapper # 使用示例 @stream async def my_async_generator(): for i in range(5): yield f"data {i}\n" await asyncio.sleep(0.1) def my_view(request): response = StreamingHttpResponse(my_async_generator(), content_type="text/plain") return response ``` 上述代码中的 `stream` 装饰器能够将异步生成器转化为适合 Django `StreamingHttpResponse` 的形式。这样就可以避免因不兼容而产生的 `TypeError` 错误[^3]。 #### 关于上下文管理器的注意事项 当涉及异步上下文管理器时,请确保所使用的类实现了 `__aenter__` 和 `__aexit__` 方法。否则可能会触发类似的错误。此外,切勿在非异步环境中尝试运行异步代码片段,这同样会引起语法或逻辑上的冲突[^2]。 #### 避免常见陷阱 需要注意的是,在由 `async def` 定义的方法内部不允许存在单独的 `yield` 或者 `yield from` 表达式;否则编译阶段就会抛出 SyntaxError 异常提示[^4]。 --- ###
评论 13
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值