Python(属性及动态绑定)

目录

一、内建属性        

二、动态绑定

三、__slots__ 

四、property属性


一、内建属性        

内建属性通常指的是 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

 

 

  • 3
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值