类实例调用类实例方法时默认传入类实例给第一个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形参),而用类名调用类成员的方法称为非绑定方法。