子类属性和父类私有属性同名问题

父类有一个私有属性 NSString *searchText;
子类也有一个属性 NSString *searchText;
父类有这么一个方法:

- (void)searchRequestWithText:(NSString *)searchText {
    _searchText = searchText;
    [self requestData];
}

而requestData方法中 调用了self.searchText
此时的self.searchText是没有被赋值的
调试可以看到 里面有两个变量
调试信息

子类调用父类的方法的时候
如果父类使用的是_searchText 这样的方法
获取到的不是子类的对应属性的值,而是父类里的对应属性的值
而如果是self.searchText 获取到的是子类里对应属性的值
原理是self. 调用了对应的getter setter方法,这个方法是可以被子类覆盖的

所以以后写代码两种写法要尽量统一(不过如果需要重写setter方法 有些地方肯定要用到self.的 父类重写的getter setter方法也会被子类覆盖 即使是私有属性 使用的时候需要注意)

  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
1. 创建一个类,包含类属性、实例属性、类方法、实例方法、静态方法 ```python class MyClass: class_attr = "class attribute" __private_class_attr = "private class attribute" def __init__(self, instance_attr): self.instance_attr = instance_attr self.__private_instance_attr = "private instance attribute" def instance_method(self): return "instance method" def __private_instance_method(self): return "private instance method" @classmethod def class_method(cls): return "class method" @staticmethod def static_method(): return "static method" ``` 2. 创建类对象 ```python my_class = MyClass("instance attribute") ``` 3. 添加类属性、实例属性 ```python MyClass.new_class_attr = "new class attribute" my_class.new_instance_attr = "new instance attribute" ``` 4. 实现访问类的属性、实例属性 ```python print(MyClass.class_attr) # "class attribute" print(my_class.instance_attr) # "instance attribute" print(MyClass.new_class_attr) # "new class attribute" print(my_class.new_instance_attr) # "new instance attribute" ``` 5. 实现 类名、类对象访问类方法 ```python print(MyClass.class_method()) # "class method" print(my_class.class_method()) # "class method" ``` 6. 实现 类对象 访问实例方法(私有方法、公有方法) ```python print(my_class.instance_method()) # "instance method" print(my_class._MyClass__private_instance_method()) # "private instance method" ``` 7. 实现 类名、类对象 访问静态方法 ```python print(MyClass.static_method()) # "static method" print(my_class.static_method()) # "static method" ``` 8. 创建该类的子类。实现父类属性、方法的重写。(子类继承父类的公有属性和方法,子类如何访问父类私有属性和方法,子类如何改写父类属性) ```python class MyChildClass(MyClass): class_attr = "child class attribute" __private_class_attr = "child private class attribute" def __init__(self, instance_attr): super().__init__(instance_attr) self.instance_attr = "child instance attribute" self.__private_instance_attr = "child private instance attribute" def instance_method(self): return "child instance method" def _MyClass__private_instance_method(self): return "child private instance method" def get_private_class_attr(self): return self._MyClass__private_class_attr ``` 9. 实现一次性访问子类父类同名方法。 ```python class MyChildClass(MyClass): class_attr = "child class attribute" __private_class_attr = "child private class attribute" def __init__(self, instance_attr): super().__init__(instance_attr) self.instance_attr = "child instance attribute" self.__private_instance_attr = "child private instance attribute" def instance_method(self): return super().instance_method() + " and child instance method" def _MyClass__private_instance_method(self): return super()._MyClass__private_instance_method() + " and child private instance method" def get_private_class_attr(self): return self._MyClass__private_class_attr my_child_class = MyChildClass("instance attribute") print(my_child_class.instance_method()) # "instance method and child instance method" print(my_child_class._MyClass__private_instance_method()) # "private instance method and child private instance method" ``` 10. 练习property对象实现类的私有属性的访问以及改写。 ```python class MyClass: def __init__(self, value): self.__value = value def get_value(self): return self.__value def set_value(self, new_value): self.__value = new_value * 2 value = property(get_value, set_value) my_class = MyClass(10) print(my_class.value) # 10 my_class.value = 5 print(my_class.value) # 10 (because set_value method multiplies the value by 2) ```

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值