python类实例方法的形参self并未做类型限定,只会在运行时做类型检查

类实例调用类实例方法时默认传入类实例给第一个self形参,self并未限定类型,只在运行时做类型检查

class Myclass(object):
    def info(self):
        print(self, "this is instance func info()")
    def info2(self):
        print(self.a, "this is instance func info2()")


class Myclass2(object):
    def __init__(self, a):
        self.a = a

obj1=Myclass()
obj1.info()       #类实例调用类实例方法时默认将类实例传给self
Myclass.info(obj1)#也可以使用类名并传入类实例来调用类实例方法

strobj='heihei'
Myclass.info(strobj)#并未限定形参self的类型(动态语言),只在运行时会进行类型检查,此例中由于所有对象都能被"打印"所以也没毛病

obj2=Myclass2('haha')
Myclass.info2(obj2)#在运行时会检查self形参的a属性,此例中由于传入对象有属性a所以没毛病

Myclass.info2(strobj)#在运行时检查self形参的a属性,此例中由于传入对象无属性a所以报属性错

python3.8运行输出:

haypin@ubt:~/Files$ python3.8 m07164.py
<__main__.Myclass object at 0x7f78daa65fd0> this is instance func info()
<__main__.Myclass object at 0x7f78daa65fd0> this is instance func info()
heihei this is instance func info()
haha this is instance func info2()
Traceback (most recent call last):
  File "m07164.py", line 22, in <module>
    Myclass.info2(strobj)#在运行时检查self形参的a属性,此例中由于传入对象无属性a所以报属性错
  File "m07164.py", line 5, in info2
    print(self.a, "this is instance func info2()")
AttributeError: 'str' object has no attribute 'a'
haypin@ubt:~/Files$

 

用类的实例对象访问类成员的方法称为绑定方法(默认将实例对象传递给实例方法的self形参),而用类名调用类成员的方法称为非绑定方法。

 

猜你喜欢

转载自blog.csdn.net/HayPinF/article/details/107427216