V2EX = way to explore
V2EX 是一个关于分享和探索的地方
现在注册
已注册用户请  登录
V2EX 提问指南
dsp2138
V2EX  ›  问与答

python 类函数定义是加 self 和不加的区别,且参数类型怎么变化的?

  •  
  •   dsp2138 · 2015-12-08 23:39:30 +08:00 · 2432 次点击
    这是一个创建于 3273 天前的主题,其中的信息可能已经有所发展或是发生改变。

    class app():
    def f(self,id):
    return type(id)

    此时需要实例化 app

    a=app()
    a.f(1)
    <class 'int'>

    如不进行实例化无法直接 app.f()
    再看下面的
    `
    class app():
    def f(self,id,*arg):
    if type(id)==int:
    return id,arg
    else:
    return type(id)

    app.f(1,'aa')
    <class 'str'>

    这里 id 竟然被转换成了 str 类型,虽然直接被调用了,但类型怎么会这样了呢
    如果进行实例化, id 就是 int 类型

    a=app()
    a.f(1,'a')
    (1, ('a',))
    `
    怎么理解 self ,和后面参数的类型变化?
    请教了

    4 条回复    2015-12-09 23:35:38 +08:00
    lxy42
        1
    lxy42  
       2015-12-09 00:02:37 +08:00
    建议看看 Python 文档或基础教程中关于类的 bind method 和 unbind method
    lxy42
        2
    lxy42  
       2015-12-09 00:14:05 +08:00   ❤️ 1
    以及 static method, class method 。回到你的问题,在类中定义的方法“默认”都是实例方法,只能通过实例调用,如你定义的 f(self, id),只能通过实例 a 调用,执行 a.f(1),这里 self 参数等于 a , id 等于 1 。在你第二个例子中, app. f(1,'aa'),这是直接用类调用实例方法,所以 self 等于 1 , id 等于'aa',arg 等于空列表。
    dsp2138
        3
    dsp2138  
    OP
       2015-12-09 20:12:21 +08:00
    @lxy42
    还有个问题,传入参数怎么限定为特定的类型!比方第一个参数就是 int 类型,第二个必须是 str ?
    通过 if 判断有点麻烦,有更好的办法吗
    lxy42
        4
    lxy42  
       2015-12-09 23:35:38 +08:00   ❤️ 1
    @dsp2138 python 是动态类型,没办法像静态类型语言那样定义函数 func(int n, string str)。只能通过 if 判断。
    关于   ·   帮助文档   ·   博客   ·   API   ·   FAQ   ·   实用小工具   ·   2723 人在线   最高记录 6679   ·     Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 · 23ms · UTC 06:37 · PVG 14:37 · LAX 22:37 · JFK 01:37
    Developed with CodeLauncher
    ♥ Do have faith in what you're doing.