@property属性修饰符

本文探讨了Objective-C与Swift两种编程语言在iOS开发领域的应用与区别,包括其特性、优缺点及实际案例分析。

1.@property属性修饰符

//@property属性修饰符:@property ()

//多个修饰符之间用逗号隔开

//1.readwrite:缺省修饰符。可读可写,既有setter方法,也有getter方法

//2.readonly:只读。只有getter方法,没有setter方法

//3.atomic:缺省修饰符。原子的,考虑线程安全

//4.nonatomic:非原子操作。iOS开发中,官方类的属性一般是nonatomic类型的,所以我们一般也写成nonatomic.

//5.assign:基础数据类型(int/float/char/double/long)的缺省修饰符。直接赋值。

//6.对象:1> 字符串:copy

//       2> 其他对象:retain

//7.修改setter或者getter方法的名字(给settergetter方法起别名)

//settergetter方法名可以不一致

 

//姓名,年龄

@property(nonatomic,copyNSString *name;   //姓名

@property(nonatomic,assign,setter = setMouseAge:,getter = mouse) int age;          //年龄

 

 

 

2.访问控制

//访问控制:默认的是受保护类型 @protected

//访问控制针对的是成员变量。成员方法没有访问控制。

//1.@protected:默认,受保护类型。在类内减方法中可以直接使用,在类外不能直接使用,但是可以通过方法间接使用。子类可以直接使用。

//2.@private:私有的。在类内可以直接使用,在类外不能直接使用,但是可以通过方法间接使用。子类不可以直接使用,但可以通过父类的方法间接使用。

//3.@public:公有的。类内和类外都可以直接使用。

 

 

 

3.为什么需要在.m中加上 @synthesize age = _age;

@implementation Work

//xcode 4.3 开始 可以 省去  @synthesize xcode 会自动加上

 

//@synthesize height = _height;

 

//协议中出现了 @property  那么遵守协议的类 必须要手动添加上@synthesize age = _age; 这时xcode 不会自动加上的

 

//必须加上

@synthesize age = _age;

 

 

- (void)func { 

}

@end

 

4.前向声明

//前向声明:告诉Teacher这个类,接下来要使用的Children是一个类。

//在一个类的.h中,如果要使用另外一个类,那么使用前向声明的方式,为了避免彼此包含。

//前向声明后,如果要在当前类的.m中使用另外一个类(Children),仍然要导入头文件

//前向声明时,注意类名不要拼错(拼错就相当于声明一个新类)

@class Children;

### Python中@property修饰器的工作原理 在Python中,`@property` 是一个内置的装饰器,用于实现类中的属性访问控制。通过使用 `@property`,可以将类的方法伪装成一个只读属性,从而使得方法调用更加简洁和直观[^1]。 具体来说,`@property` 的主要作用是将一个类的方法转换为只读属性。这样做的好处是可以隐藏对象内部的实现细节,同时提供一种更自然的方式来访问对象的状态。以下是 `@property` 的基本工作原理: #### 1. 只读属性 当一个方法被 `@property` 装饰后,它就可以像普通属性一样被访问,而无需显式地调用方法。例如: ```python class Person: def __init__(self, name): self._name = name @property def name(self): return self._name person = Person("Alice") print(person.name) # 输出: Alice ``` 在此示例中,`name` 方法被装饰为 `@property`,因此可以通过 `person.name` 直接访问,而不需要调用 `person.name()`[^1]。 #### 2. 设置和删除属性 除了定义只读属性外,`@property` 还支持通过 `@<property_name>.setter` 和 `@<property_name>.deleter` 来实现对属性的设置和删除功能。例如: ```python class Person: def __init__(self, name): self._name = name @property def name(self): return self._name @name.setter def name(self, value): if not isinstance(value, str): raise ValueError("Name must be a string.") self._name = value @name.deleter def name(self): del self._name person = Person("Alice") person.name = "Bob" # 使用 setter 修改属性值 print(person.name) # 输出: Bob del person.name # 使用 deleter 删除属性 ``` 上述代码中,`@name.setter` 定义了如何设置 `name` 属性的值,而 `@name.deleter` 定义了如何删除该属性[^3]。 #### 3. 内部机制 `@property` 实际上是一个描述符(descriptor),它通过重载 `__get__`、`__set__` 和 `__delete__` 方法来实现对属性的访问控制。描述符是一种特殊的类,用于管理其他类中属性的行为。以下是 `@property` 的简化实现: ```python class Property: def __init__(self, fget=None, fset=None, fdel=None): self.fget = fget self.fset = fset self.fdel = fdel def __get__(self, instance, owner): if instance is None: return self if self.fget is None: raise AttributeError("unreadable attribute") return self.fget(instance) def __set__(self, instance, value): if self.fset is None: raise AttributeError("can't set attribute") self.fset(instance, value) def __delete__(self, instance): if self.fdel is None: raise AttributeError("can't delete attribute") self.fdel(instance) ``` 通过这种机制,`@property` 能够拦截对属性的访问、修改和删除操作,并执行相应的逻辑[^4]。 ### 总结 `@property` 提供了一种优雅的方式,使方法看起来像普通的属性访问,同时保留了对属性访问的控制能力。这不仅提高了代码的可读性,还增强了数据封装的安全性[^5]。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值