类内的变量可以作为类方法的参数的默认值吗?

2015-09-10 22:39:12 +08:00
 leisurelylicht
```python
class W ():
def __init__(self ):
super (W, self ).__init__()
self.url = 'http://api'

def dataRequest (self,url=self.url ):

test = W ()
test.dataRequest ()

```
向上面这样,调用 dataRequest ()不带参数时就用 self.url,带参数时就用参数.

已经试过这么写无法执行的,就想问下是没有这种使用方法还是我的方法写错了?
2193 次点击
所在节点    Python
10 条回复
publicID002
2015-09-10 22:59:17 +08:00
def dataRequest (self, url=None ):
url = url or self.url
print (url )
leisurelylicht
2015-09-10 23:04:14 +08:00
@publicID002 只能在方法内做判断吗
soyxulu
2015-09-10 23:11:35 +08:00
看下那个位置的 self 是什么呢 到底能不能获取到 self.url
def dataRequest (self,obj = self ):
print obj.url
leisurelylicht
2015-09-10 23:19:26 +08:00
@soyxulu 应该是不可以,显示 NameError: name 'self' is not defined
hahasong
2015-09-10 23:24:36 +08:00
默认参数只能是常量,不关 self 写在哪里什么事
hahasong
2015-09-10 23:34:36 +08:00
@hahasong https://docs.python.org/2/tutorial/controlflow.html#default-argument-values
The default values are evaluated at the point of function definition in the defining scope
leisurelylicht
2015-09-11 00:07:10 +08:00
@hahasong 但是这种方法就可以啊
i = 5

def f (arg=i ):
print arg

f (7 )
deanguqiang
2015-09-11 00:22:37 +08:00
类的方法都是非资料描述器,在其 __get__() 方法里面会把 obj.fun (*args ) 调用自动改成 fun (obj, *args ) ,所以第一个参数 self 会被传入对象实例,但是其余参数是不知道 self 是什么东西的。
leisurelylicht
2015-09-11 15:09:55 +08:00
@deanguqiang 请问有什么相关资料吗,有点看不懂
deanguqiang
2015-09-11 22:03:46 +08:00
@leisurelylicht
你可以搜索一下描述器 descriptor 。或者看看这个链接: http://pyzh.readthedocs.org/en/latest/Descriptor-HOW-TO-Guide.html#id6

关键是知道 python 中 self 并不是一个关键词,那么对象是怎么传递给方法呢?就是方法的时候第一个形参(通常是 self ,也可以改成其他的)会被传入对象,其余的参数是原封不动给函数的。这里实现的机制是描述器,即如果类里面定义的方法是:

def fun (self, arg=self.bar ):
pass

调用方法的时候 obj.fun () 被改成 fun (obj, arg=self.bar ),这个时候 self 是未定义的,所以会出错。

这是一个专为移动设备优化的页面(即为了让你能够在 Google 搜索结果里秒开这个页面),如果你希望参与 V2EX 社区的讨论,你可以继续到 V2EX 上打开本讨论主题的完整版本。

https://www.v2ex.com/t/219809

V2EX 是创意工作者们的社区,是一个分享自己正在做的有趣事物、交流想法,可以遇见新朋友甚至新机会的地方。

V2EX is a community of developers, designers and creative people.

© 2021 V2EX