IPHONE 获得类名或 属性列

本文深入探讨了Objective-C中的属性类型定义、获取属性列表的方法以及如何操作属性名称、编码等核心内容。

属性类型和相关函数

属性(Property)类型定义了对描述属性的结构体objc_property的不透明的句柄。

typedef struct objc_property *Property;

您可以使用函数class_copyPropertyListprotocol_copyPropertyList来获得类(包括范畴类)或者协议类中的属性列表:

objc_property_t *class_copyPropertyList(Class cls, unsigned int *outCount)
objc_property_t *protocol_copyPropertyList(Protocol *proto, unsigned int *outCount)

例如,有如下的类声明:

@interface Lender : NSObject {
    float alone;
}
@property float alone;
@end

您可以象这样获得它的属性:

id LenderClass = objc_getClass("Lender");
unsigned int outCount;
objc_property_t *properties = class_copyPropertyList(LenderClass, &outCount);

您还可以通过property_getName函数获得属性的名字:

const char *property_getName(objc_property_t property)

函数class_getPropertyprotocol_getProperty则在类或者协议类中返回具有给定名字的属性的引用:

objc_property_t class_getProperty(Class cls, const char *name)
objc_property_t protocol_getProperty(Protocol *proto, const char *name, BOOL isRequiredProperty, BOOL isInstanceProperty)

通过property_getAttributes函数可以获得属性的名字和@encode编码。关于类型编码的更多细节,参考“类型编码“一节;关于属性的类型编码,见“属性类型编码”“属性特征的描述范例”

const char *property_getAttributes(objc_property_t property)

综合起来,您可以通过下面的代码得到一个类中所有的属性。

id LenderClass = objc_getClass("Lender");
unsigned int outCount, i;
objc_property_t *properties = class_copyPropertyList(LenderClass, &outCount);
for (i = 0; i < outCount; i++) {
    objc_property_t property = properties[i];
    fprintf(stdout, "%s %s\n", property_getName(property), property_getAttributes(property));
}

### **回答问题** 在 Python 中,类名.属性和实例对象.属性是两种不同的属性访问方式。前者指的是类属性,后者指的是实例属性。以下是它们的定义、区别以及代码示例。 --- #### **1. 类属性** 类属性是定义在类中的属性,它属于类本身,所有实例共享同一个类属性。通过类名实例都可以访问类属性,但通过实例修改类属性时需要注意:如果实例没有同名的实例属性,修改的是类属性;如果实例有同名的实例属性,则修改的是实例属性。 ```python class MyClass: class_attr = "I am a class attribute" # 类属性 # 通过类名访问类属性 print(MyClass.class_attr) # 输出: I am a class attribute # 创建实例并通过实例访问类属性 obj = MyClass() print(obj.class_attr) # 输出: I am a class attribute # 修改类属性 MyClass.class_attr = "Modified class attribute" print(MyClass.class_attr) # 输出: Modified class attribute print(obj.class_attr) # 输出: Modified class attribute # 如果通过实例修改类属性,会创建一个同名的实例属性 obj.class_attr = "Instance attribute" print(obj.class_attr) # 输出: Instance attribute print(MyClass.class_attr) # 输出: Modified class attribute ``` **解释:** - `MyClass.class_attr` 是通过类名访问类属性。 - `obj.class_attr` 是通过实例访问类属性,实际上是访问类中的 `class_attr`。 - 当通过实例修改 `class_attr` 时,实际上是在实例中创建了一个新的实例属性,而不会影响类属性。 --- #### **2. 实例属性** 实例属性是定义在构造函数 `__init__` 中的属性,每个实例都有独立的实例属性。实例属性只能通过实例对象访问,不能通过类名直接访问。 ```python class MyClass: def __init__(self, value): self.instance_attr = value # 实例属性 # 创建两个实例 obj1 = MyClass("Value for obj1") obj2 = MyClass("Value for obj2") # 访问实例属性 print(obj1.instance_attr) # 输出: Value for obj1 print(obj2.instance_attr) # 输出: Value for obj2 # 尝试通过类名访问实例属性(会报错) # print(MyClass.instance_attr) # 报错: AttributeError ``` **解释:** - 每个实例都有自己独立的 `instance_attr` 属性。 - 实例属性只能通过实例对象访问,不能通过类名直接访问。 --- #### **3. 类属性与实例属性的区别** | 特性 | 类属性 | 实例属性 | |--------------------|--------------------------------|-------------------------------| | 定义位置 | 在类中定义 | 在 `__init__` 方法中定义 | | 访问方式 | 可以通过类名实例访问 | 只能通过实例访问 | | 共享性 | 所有实例共享 | 每个实例独立拥有 | | 修改影响 | 修改会影响所有实例 | 修改只影响当前实例 | --- #### **4. 动态添加属性** 即使没有在类构造函数中定义属性,也可以动态地为类实例添加属性。 ```python class MyClass: pass # 动态为类添加类属性 MyClass.new_class_attr = "New class attribute" print(MyClass.new_class_attr) # 输出: New class attribute # 创建实例并动态添加实例属性 obj = MyClass() obj.new_instance_attr = "New instance attribute" print(obj.new_instance_attr) # 输出: New instance attribute ``` --- ### **相关问题**
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值