目录
一、内建属性
内建属性通常指的是 Python 对象的一些标准属性,这些属性由 Python 语言本身定义,用于控制对象的行为。
# 常见的内建属性
# __name__
# 返回类、方法、函数、模块等的名字。
# 例如:print(my_function.__name__)。
# __doc__
# 返回对象的文档字符串(docstring)。
# 例如:print(my_class.__doc__)。
# __module__
# 返回对象所在的模块名称。
# 例如:print(my_function.__module__)。
# __bases__
# 返回类的所有基类组成的元组。
# 例如:print(my_class.__bases__)。
# __dict__
# 返回对象的字典形式,包含对象的属性和方法。
# 例如:print(my_object.__dict__)。
# __class__
# 返回对象所属的类。
# 例如:print(my_instance.__class__)。
# __mro__
# 返回类的继承顺序列表。
# 例如:print(my_class.__mro__)。
# __slots__
# 如果类定义了 __slots__,那么这个属性会返回类的槽列表。
# 例如:print(my_class.__slots__)。
# __weakref__
# 如果对象可以拥有弱引用,则该属性返回一个弱引用对象。
# 例如:print(my_object.__weakref__)。
# 示例:
class MyClass:
"""这是一个简单的类"""
def __init__(self):
self.value = 42
def method(self):
"""这是一个方法"""
return "Hello, world!"
# 创建一个实例
instance = MyClass()
# 访问内建属性
print("Class name:", MyClass.__name__) #输出类 MyClass 的名字,即 MyClass。
print("Class docstring:", MyClass.__doc__) #输出类 MyClass 的文档字符串,即 "这是一个简单的类"。
print("Instance dictionary:", instance.__dict__) #输出实例 instance 的字典,即 { 'value': 42 }。
print("Method docstring:", instance.method.__doc__) #输出方法 method 的文档字符串,即 "这是一个方法"。
print("Class bases:", MyClass.__bases__) #输出类 MyClass 的基类列表,通常为 (object,),因为 MyClass 默认继承自 object。
print("Instance class:", instance.__class__) #输出实例 instance 的类,即 <class '__main__.MyClass'>。
print("Class MRO:", MyClass.__mro__) #输出类 MyClass 的方法解析顺序列表,通常为 (MyClass, object)。
二、动态绑定
Python 的动态绑定(Dynamic Binding)是指在运行时确定对象的方法和属性的过程。
动态绑定的几个方面
1、动态方法绑定: Python 中的对象可以在运行时获得新方法。 当我们尝试调用一个对象的方法时,Python 会在运行时查找该方法,并执行相应的函数。 2、动态属性绑定: Python 中的对象可以在运行时获得新属性。 我们可以在任何时候给对象添加新属性。
class MyClass:
"""这是一个简单的类"""
def __init__(self):
self.value = 42
def method(self):
"""这是一个方法"""
return "Hello, world!"
# 创建一个实例
instance = MyClass()
# 动态绑定新属性
instance.new_attribute = "New value" #给 instance 添加了一个名为 new_attribute 的新属性。
# 动态绑定新方法
def new_method(self): #新定义了一个名为new_method
return "This is a new method."
# 将新方法绑定到实例上
instance.new_method = new_method.__get__(instance, MyClass)
# 这里使用了 __get__ 方法将 new_method 转换成一个绑定方法。
# instance: 这是你想要绑定方法的实例。
# MyClass: 这是实例所属的类。
# new_method.__get__(instance, MyClass)返回一个新的绑定方法对象,这个对象已经与 instance 关联起来,所以它可以通过 self 参数访问 instance 的属性。
# 将生成的绑定方法对象赋值给 instance.new_method。
# 现在 instance 有了一个名为 new_method 的方法,它能够像任何其他方法一样被调用,并且可以访问 instance 的属性。
# 访问内建属性
print("Class name:", MyClass.__name__)
print("Class docstring:", MyClass.__doc__)
print("Instance dictionary:", instance.__dict__)
print("Method docstring:", instance.method.__doc__)
print("Class bases:", MyClass.__bases__)
print("Instance class:", instance.__class__)
print("Class MRO:", MyClass.__mro__)
# 使用动态绑定的方法和属性
print("New attribute value:", instance.new_attribute)
print("New method output:", instance.new_method())
三、__slots__
__slots__ 特性是用来优化内存使用并提高实例属性访问速度的。
概述: 内存优化: 通常情况下,Python 使用字典 (__dict__) 来动态存储实例属性。通过使用 __slots__,你可以声明一组固定的实例变量,这些变量将被以更紧凑的格式存储。 性能提升: 访问在 __slots__ 中定义的属性比访问字典中的属性更快。
# 示例:
class Person:
__slots__ = ('name', 'age') #__slots__中定义 name age 属性
def __init__(self, name, age):
self.name = name
self.age = age
# 创建一个 Person 实例
p = Person('张三', 25)
# 由于使用了 __slots__,尝试给实例添加一个不在 __slots__ 列表中的属性会引发 AttributeError
try: #它允许你在其中尝试执行一些可能引发异常的代码。如果在这段代码中发生任何异常,它将被捕获并处理。
p.gender = 'male' #在p实例中定义gender属性 并将male赋给gender
except AttributeError as e:
#这一行定义了一个 except 块,用于捕获由 try 块中的代码引发的 AttributeError。
# 如果 try 块中的代码引发了一个 AttributeError,那么这个异常将被这里的 except 块捕获,并且异常对象会被赋值给变量 e。
print("错误:", e)
#输出:错误: 'Person' object has no attribute 'gender'
四、property属性
property 是一种内置的类,用于封装对象的属性访问方式。它允许你以函数的形式定义类的属性,但可以让这些属性像普通的类属性一样被访问(即使用点号语法)。
读取属性(getter):允许你定义一个方法来返回一个属性的值。 设置属性(setter):允许你定义一个方法来设置一个属性的值。 删除属性(deleter):允许你定义一个方法来删除一个属性。
property函数的使用方法:
这里的 ... 表示实际的方法体,可以包含任何返回值的逻辑。
# @property 装饰器将其转换为一个只读属性。这意味着你可以像访问普通属性一样访问该方法的结果,而不需要调用括号。
@property
def fget(self): ...
# @fget.setter 装饰器将其绑定到前面定义的 fget 属性。fset 方法通常用于设置一个私有属性的值。这个方法接收一个参数 value,这是要设置的新值。
@fget.setter
def fset(self, value): ...
# @fget.deleter 装饰器将其绑定到前面定义的 fget 属性。fdel 方法通常用于删除与属性相关的数据。
@fget.deleter
def fdel(self): ...
# 示例:
class Circle:
def __init__(self, radius):
self._radius = radius
@property
def radius(self):
"""获取圆的半径"""
return self._radius
@radius.setter
def radius(self, value):
"""设置圆的半径"""
if value < 0:
# raise 关键字: raise 是用来手动引发异常的关键字。
# ValueError 类: ValueError 是 Python 内置的一个异常类,通常用于指示传递给函数的参数具有正确的类型但不合适的值。
# 异常被引发打印Radius cannot be negative.
raise ValueError("Radius cannot be negative.")
self._radius = value
@radius.deleter
def radius(self):
"""删除圆的半径属性"""
del self._radius
# 创建一个 Circle 实例
c = Circle(5)
# 使用 getter 获取半径
print(c.radius) # 输出: 5
# 使用 setter 设置半径
c.radius = 10
print(c.radius) # 输出: 10
# 尝试设置一个负数作为半径
try:
c.radius = -5
except ValueError as e:
print(e) # 输出: Radius cannot be negative.
# 删除半径属性
del c.radius