关于python类的疑问
怪我咯
怪我咯 2017-04-17 17:30:19
[Python讨论组]
class Animal(object):
    def run(self):
        print('Animal is running')
class Cat( Animal):
    pass
class Dog(Animal):
    pass

dog = Dog() #倘若直接执行Dog.run()为什么不行呢?
dog.run() #提示:run() missing 1 required positional argument: 'self'

#而且为什么isinstance(Dog, Animal)返回的是false,而isinstance(dog,Dog)返回的却是True呢?
        
        

基础不扎实,麻烦各位点拨一下,先谢谢啦。

怪我咯
怪我咯

走同样的路,发现不同的人生

全部回复(5)
天蓬老师

因为run(self)方法的定义,这不是一个类方法或者静态方法
所以需要以下调用

dog = Dog()
dog.run()

它有一个参数的,你比较一下
type(Dog.run)type(dog.run)的结果
可以看到两个类型不一样
Dog.run是一个函数,它需要一个参数,
dog.run是一个方法,实际上是一个包装
执行dog.run()就像Dog.run(dog),将dog绑定到了self参数上
所以有run() missing 1 required positional argument: 'self'的错误

第二个问题isinstance(obj, cls)顾名思义是判断对象是否是类的实例
判断父类用issubclass(cls, cls)

天蓬老师

要在子类当中初始化父类,或用super

class Animal(object):
    def run(self):
        print('Animal is running')
class Dog(Animal):
    def __init__(self):
        Animal.__init__(self)
    pass
class Animal(object):
    def run(self):
        print('Animal is running')
class Dog(Animal):
    super(Animal,self).__init__()
    pass
PHP中文网

你的这个问题应该是不存在的,Dog类继承了Animal类的run函数,run函数是绑定方法,所以需要传入实例作为参数(也就是self)。
2.7中的类的中的函数(或者成为方法)要求第一个参数是self(称为绑定方法,还有一种非绑定方法是你不在def赋值语句的小括号中传入self参数,但是在2.x中,非绑定方法在调用的时候还是需要传入一个实例作为参数),而到了3.0,非绑定方法就和普通的函数一样了(不需要传入实例作为参数来调用,和普通函数一样通过class.func()调用就可以)。
还有同样是新手哈

伊谢尔伦
class Animal(object):
    def run(self):
        print('Animal is running')
class Dog(Animal):
    super(Dog,self).__init__()#这里貌似是Dog,不是Animal,楼上的回答应该是手抖打错了
    pass
迷茫

问题理解错了, 当我没说...参考上面有关super的方法;

热门教程
更多>
最新下载
更多>
网站特效
网站源码
网站素材
前端模板
关于我们 免责申明 意见反馈 讲师合作 广告合作 最新更新
php中文网:公益在线php培训,帮助PHP学习者快速成长!
关注服务号 技术交流群
PHP中文网订阅号
每天精选资源文章推送
PHP中文网APP
随时随地碎片化学习
PHP中文网抖音号
发现有趣的

Copyright 2014-2025 https://www.php.cn/ All Rights Reserved | php.cn | 湘ICP备2023035733号