OC基础:getter和setter,@public @protected @private

本文介绍了面向对象编程中的封装概念及其重要性,包括不同访问修饰符(public、protected、private)的使用方法,以及如何通过setter和getter方法来实现对外部访问的控制。

@public

1.公开的,公共的,可以在类的内部和外部访问.

2.类的内部:实例变量名

3.类的外部:对象->实例变量名

@protected

1.受保护的,只能在本类和子类中可以访问

2.类的内部:实例变量名

3.类的外部:通过设置器setter和访问器getter访问

@private

1.私有的,只能在本类中可以访问

2.类的内部:实例变量名

3.类的外部:通过设置器setter和访问器getter访问

总:@public 在所有文件均可访问.@protected只能在本类和子类中可以访问@priavte只能在本类中可以访问


设置器 setter

1.setter 一定是对象方法,以-开头

2.返回值一定是void

3.一定以set开头,后跟实例变量名去除_,实例变量名首字母大写.如:setAge

4.一定要有参数,参数类型必须和实例变量的类型一致,参数名为实例变量名去除_

NSInteger _age

-(void)setAge:(NSInteger)age;


访问器  getter

1.getter 一定是对象方法,以-开头

2.一定有返回值,返回值类型和实例变量的类型一致

3.方法名只为实例变量名去除_即可.如:age

NSInteger  _age

-(NSInteger)Age;


-----------------------------------------------------------------------------------------------------------------------------------------

封装

目的:为了实现高类聚.低耦合.为了隐藏数据,只能通过此类的方法才可以访问,修改数据.不被外界随意修改,降低误用性.

类聚:模块成员之间的关系程度.

耦合:模块之间的关系程度.

-----------------------------------------------------------------------------------------------------------------------------------------

对象方法   +

在对象方法中能够使用实例对象

对象方法只能由对象调用  [对象名 方法]

类方法   -

在类方法中不能使用实例变量,因为类方法由类来调用.并没有创建储存空间.

类方法只能由类来调用  [类  方法]

类方法的好处:不依赖对象,执行效率高,尽量使用类方法

类方法的场合:方法中不需要实例方法的时候,使用类方法更简洁

-----------------------------------------------------------------------------------------------------------------------------------------

提取方法名

-(void)say:(NSString)name;        //方法名为say:

-(void)say:(NSString *)name withCount:(NSInteger)count;      //方法名为say:withCount:

去除-(+)

去掉返回值

去掉参数类型和参数名



<think>好的,用户想了解Python中的@property以及相关的装饰器@getter、@setter、@deleter的用法,并需要示例。我需要结合之前的引用内容来组织回答。 首先,我应该回顾用户提供的三个引用。引用[1]中提到了描述符的实现,其中提到了使用__dict__存储属性值,这可能与@property不同,但可以对比说明。引用[2][3]则是关于@property的具体使用,尤其是如何正确使用setter避免递归错误。用户的问题主要集中在@property相关装饰器,所以需要重点讲解这些。 接下来,我需要确定回答的结构。通常,先介绍@property的作用,然后分别讲解gettersetter、deleter的用法,每个部分给出示例代码。同时需要注意用户提到的常见错误,比如在setter中错误赋值导致递归,这在引用[2]中有例子,需要指出并说明正确的做法。 然后,可能需要对比描述符@property的区别,引用[1]中的描述符实现可以作为一个高级用法的例子,但用户主要关心的是@property,所以这部分可以作为补充。不过要确保回答不偏离主题。 另外,用户要求生成相关问题,我需要根据内容提出相关的问题,比如应用场景、与描述符的区别、常见错误等。 需要注意用户提供的示例是否正确,比如在setter中是否使用了正确的属性名,比如使用self._name而不是self.name,避免递归。引用[3]中的官方示例是正确的,可以引用。 总结回答的结构: 1. 介绍@property的作用,将方法转为属性访问。 2. 分步骤讲解gettersetter、deleter的定义方法,每个步骤给出代码示例。 3. 强调命名规范,比如使用下划线前缀存储实际值。 4. 常见错误注意事项,比如递归问题。 5. 对比描述符@property的应用场景。 在示例代码中,需要确保语法正确,比如装饰器的使用,属性名称的正确引用。例如,在setter中赋值给self._name而不是self.name,否则会触发setter导致递归,这在引用[2]中已经提到。 可能还需要解释为什么需要先定义getter才能定义setter,这与Python的装饰器机制有关,引用[3]中提到了这一点。 最后,生成相关问题时要围绕主题,比如使用场景、与描述符的对比、如何避免错误等。</think>### Python @property及相关装饰器用法详解 Python的`@property`装饰器可以将方法转换为属性访问,实现类似传统getter/setter的封装效果。以下是具体用法注意事项: --- #### 一、基础用法:实现只读属性 ```python class Circle: def __init__(self, radius): self._radius = radius # 使用_前缀存储实际值 @property def radius(self): # getter方法 print("获取半径值") return self._radius # 使用示例 c = Circle(5) print(c.radius) # 调用getter方法,输出:获取半径值 5 c.radius = 10 # 报错:AttributeError,未定义setter ``` --- #### 二、完整属性控制:定义setter/deleter ```python class Temperature: def __init__(self, celsius): self._celsius = celsius @property def celsius(self): # getter return self._celsius @celsius.setter def celsius(self, value): # setter if value < -273.15: raise ValueError("温度不能低于绝对零度") self._celsius = value # 必须操作带_的属性 @celsius.deleter def celsius(self): # deleter print("删除温度值") del self._celsius # 使用示例 t = Temperature(25) t.celsius = 30 # 正常设置 t.celsius = -300 # 抛出ValueError del t.celsius # 输出:删除温度值 ``` --- #### 三、关键注意事项 1. **命名规范**:实际数据存储在`_name`属性,避免与属性名`name`冲突[^3] 2. **执行顺序**:必须先定义@property再定义setter/deleter[^3] 3. **递归陷阱**:setter内必须操作带下划线的属性(如`self._name`),直接写`self.name`会触发无限递归[^2] 4. **类型检查**:可在setter中添加逻辑(如类型验证、范围检查) --- #### 四、与描述符的对比 普通`@property`适用于单个类的属性控制,而描述符(如引用[1]的`DataDescriptor`)更适用于跨多个类重用的属性管理逻辑。 ---
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值