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形参),而用类名调用类成员的方法称为非绑定方法。

 
在一个类中调用另一个类的实例方法并传递参数,通常需要将另一个类的实例作为调用对象,并通过该对象调用目标方法。这种方式可以灵活地组合多个类的功能,实现解耦的设计。 例如,定义两个类 `Person` 和 `Car`,其中 `Person` 类的方法 `go_to` 接收一个 `Car` 类的实例作为参数,并通过该实例调用其 `run` 方法: ```python class Person: def __init__(self, name): self.name = name def go_to(self, position, transport): print(f'{self.name} 去 {position}') transport.run(position) # 调用另一个类的实例方法并传入参数 class Car: def run(self, destination): print(f'开车前往 {destination}') ``` 在实际使用中,需要先创建 `Car` 类的实例,并将其作为参数传入 `Person` 的 `go_to` 方法中: ```python c = Car() p = Person('张三') p.go_to('东北', c) # 输出:张三 去 东北;开车前往 东北 ``` 在上述实现中,`go_to` 方法接收 `position` 和 `transport` 两个参数。其中 `transport` 是一个对象,具备 `run` 方法,这种设计体现了 Python 的“鸭子类型”(duck typing)特性,即只要对象具备所需行为,即可用于相应操作[^2]。 此外,也可以通过在类中直接创建另一个类的实例来实现类似功能。例如,在 `Person` 类中直接实例化 `Car`,并调用其方法: ```python class Person: def __init__(self, name): self.name = name self.transport = Car() # 在初始化创建另一个类的实例 def go_to(self, position): print(f'{self.name} 去 {position}') self.transport.run(position) # 调用另一个类的实例方法并传入参数 class Car: def run(self, destination): print(f'开车前往 {destination}') ``` 使用方式如下: ```python p = Person('李四') p.go_to('北京') # 输出:李四 去 北京;开车前往 北京 ``` 此类设计模式有助于将功能模块化,使得代码结构更清晰,同支持灵活的扩展性[^1]。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值