self和super 详解

本文详细解析了 Objective-C 编程语言中 self 和 super 的工作原理及使用方式,通过具体示例展示了如何利用这两个关键字实现方法调用,并解释了它们之间的区别。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

@interface Person:NSObject

 { 

    NSString* name; 

 } 

- (void) setName:(NSString*) yourName; 

@end


 @interface PersonMe:Person

 {

 NSUInteger age; 

}

 - (void) setAge:(NSUInteger) age; 

- (void) setName:(NSString*) yourName andAge:(NSUInteger) age; 

@end


 @implementation PersonMe

 - (void) setName:(NSString*) yourName andAge:(NSUInteger) age { 

[self setAge:age]; 

[super setName:yourName]; 

@end

 int main(int argc, char* argv[]) 

{

 NSAutoreleasePool* pool = [[NSAutoreleasePool alloc] init]; PersonMe* me = [[PersonMe alloc] init]; 

[me setName:@"asdf" andAge:18];

 [me release]; 

[pool drain]; return 0;

 }

self是类的隐藏的参数,指的是当前调用方法的类,另外一个隐藏参数是 _cmd,代表当前类方法的selector。

super并不是隐藏参数,它是一个“编辑器指示符”,它和self指向给的是相同的消息接受者

如上面的代码

[self setAge:age]; 

[super setName:yourName]; 

不论是哪个,接收“setName”这个消息的接受者都是PersonMe* me 这个对象,不同的是super告诉编译器,当调用setName这个方法时,要去调用父类的方法,而不是在本类里。

当使用self调用方法时,会从当前类的方法列表中开始找,如果没有,就从父类中再找,

而当使用super时,则直接从父类的方法列表中开始找,然后调用父类的这个方法

### Python `super()` 函数详解 `super()` 是一种用于调用父类方法的强大工具,在多继承的情况下尤其有用。它允许子类访问其父类的方法,而无需显式指定父类名称。 #### 基本语法 在 Python 3.x 中,`super()` 可以不带参数直接使用,而在 Python 2.x 中则需要提供两个参数:当前类实例对象[^1]。 基本形式如下: ```python super([type[, object-or-type]]) ``` 当省略参数时,默认会获取当前类及其第一个参数(通常是 `self` 或者 `cls`)。这使得代码更加简洁易读。 #### 使用场景与示例分析 以下是基于引用内容的一个具体案例说明如何利用 `super()` 实现多重继承下的初始化逻辑: 假设存在以下类结构: ```python class A: def __init__(self): print("A") class B(A): def __init__(self): print("B") super().__init__() class C(A): def __init__(self): print("C") super().__init__() class D(B, C): def __init__(self): print("D") super().__init__() ``` 执行 `D()` 后的结果将是按照 Method Resolution Order (MRO)[^3] 来决定实际调用顺序。最终输出为: ``` D B C A ``` 这是因为 MRO 定义了一个线性化的继承路径来解决钻石型继承问题,从而确保每个超类只被调用一次并遵循左至右的原则。 #### 工作机制解析 `super()` 并不是简单返回某个特定类型的父类实例,而是依据动态创建的对象链表(MRO),找到下一个应该被执行的类成员函数地址位置[^2]。这种设计极大地增强了程序灵活性以及可维护性。 对于上述例子而言,当我们调用了 `super().__init__()` 方法之后,实际上是在沿着预定义好的查找链条继续寻找合适的构造器直至最顶层基类完成整个过程。 --- ### 总结 综上所述,`super()` 提供了一种优雅的方式来处理单重或多重重叠关系中的属性共享情况;同时由于支持自动计算最佳匹配路线图即所谓的MRO算法,因此即使面对复杂嵌套层次也能保持清晰直观的表现效果[^3]. ```python # 示例代码展示 Super 的应用 class Animal: def sound(self): return '...' class Dog(Animal): def sound(self): result = super().sound() return f"{result} Woof!" dog_instance = Dog() print(dog_instance.sound()) # 输出: ... Woof! ```
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值