python 类的自定义属性

本文介绍了Python中property的使用方法,如何通过property为类灵活定义只读或可读写属性,提供了实例演示及源码解析。

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

  可以利用property来为类灵活定义属性

property 原型如下:

class C(object):

    ...

    attrib = property(fget=None, fset=None, fdel=None, doc=None)

o = C()

执行o.attrib,则调用fget指定的函数;

执行o.attrib= value 则调用fset函数;

执行del o.attrib 则调用fdel函数了

doc 为所定义的属性指定docstring

 

显然如果不设置fset参数则此此属性成为名符其实的只读属性

如下为一个典型的使用示例(节选自Django框架中某处源码)

 

转载于:https://www.cnblogs.com/johan/archive/2013/01/04/2843840.html

### 定义实例属性Python 中,可以通过 `__init__` 方法为的实例设置属性。这些属性被称为 **实例属性**,因为它们属于具体的某个对象实例而非整个。以下是实现方式的一个例子: ```python class Person: def __init__(self, name, age): self.name = name # 实例属性 self.age = age # 实例属性 person_instance = Person("Alice", 30) print(person_instance.name) # 输出 Alice print(person_instance.age) # 输出 30 ``` 上述代码展示了如何通过 `self.<attribute_name>` 的形式为实例绑定属性[^3]。 --- ### 定义属性 与实例属性不同的是,**属性** 是在整个范围内共享的属性,它不属于任何一个特定的实例。定义属性的方式非常简单,只需直接在体中声明即可。 ```python class Car: wheels = 4 # 属性 car1 = Car() car2 = Car() print(car1.wheels) # 输出 4 print(car2.wheels) # 输出 4 Car.wheels = 6 # 修改属性会影响所有实例 print(car1.wheels) # 输出 6 print(car2.wheels) # 输出 6 ``` 这里可以看到,修改属性会直接影响到所有的实例,除非该实例重新设置了同名的属性[^2]。 --- ### 动态添加属性 除了在定义时预先设定属性外,还可以动态地为实例或添加新的属性。对于实例来说,可以直接通过点号操作符为其赋值;而对于,则可通过名称直接赋值。 #### 添加实例属性 ```python class Animal: pass dog = Animal() dog.species = "Canine" # 动态添加实例属性 print(dog.species) # 输出 Canine ``` 此行为利用了 Python 的灵活性特性[^1]。 #### 添加属性 ```python class Bird: pass Bird.has_wings = True # 动态添加属性 print(Bird.has_wings) # 输出 True ``` 需要注意的是,虽然可以随时向已存在的对象添加属性,但在设计程序逻辑时应谨慎使用这种做法以保持清晰性和可维护性。 --- ### 删除属性 如果不再需要某些属性,可以使用内置函数 `delattr()` 或者简单的删除语句将其移除。例如: ```python class ExampleClass: shared_value = 99 example_obj = ExampleClass() del example_obj.shared_value # 错误:尝试删除实例上的属性会失败 del ExampleClass.shared_value # 正确:成功删除属性 ``` 另外也可以借助于 `delattr()` 函数完成相同的操作[^4]。 --- ### 属性查找机制 当访问一个对象的属性时,Python 首先会在实例字典 (`__dict__`) 中寻找对应的键值对。如果没有找到匹配项,则继续向上级链表查询直至到达最顶层基为止。假如仍然未能定位目标数据,并且当前别实现了特殊方法 `__getattr__()` ,那么将调用后者处理请求[^5]。 ---
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值