首页 > 其他分享 >属性控制

属性控制

时间:2024-12-11 10:09:53浏览次数:2  
标签:__ 控制 name self value class def 属性

1.__slots__控制属性访问

class MyClass:
    __slots__ = ('attr1', 'attr2')

    def __init__(self):
        self.attr1 = 10
        self.attr2 = 20
# 尝试添加不在 __slots__ 中的属性会报错
obj = MyClass()
obj.attr3 = 30  # 会引发 AttributeError

 

class Employee:
    __slots__ = ('name', 'id', 'department')

    def __init__(self, name, id, department):
        self.name = name
        self.id = id
        self.department = department

# 创建多个员工实例,节省内存
employees = [Employee('John', 1, 'HR'), Employee('Alice', 2, 'Finance')]

 

# 数据类(dataclass):结合 __slots__ 可以更高效地定义具有固定属性的数据类。
from dataclasses import dataclass
@dataclass(slots=True)
class Point:
    x: int
    y: int

 

# 内存视图(memoryview):用于高效地操作内存缓冲区,可与 __slots__ 一起优化内存使用
import array
class MyArray:
    __slots__ = ('data',)

    def __init__(self):
        self.data = array.array('i')
    def append(self, value):
        self.data.append(value)
arr = MyArray()
arr.append(1)

 

2.使用@property装饰器来实现属性的访问控制

class MyClass:
    def __init__(self):
        self._value = 0
    @property
    def value(self):
        return self._value

    @value.setter
    def value(self, new_value):
        if new_value >= 0:
            self._value = new_value
        else:
            raise ValueError("Value must be non-negative")
obj = MyClass()
print(obj.value)  
obj.value = 5
print(obj.value)  
# 尝试设置负数值会引发 ValueError
# obj.value = -1

 

class Person:
    def __init__(self, age):
        self.age = age

    @property
    def age(self):
        return self._age

    @age.setter
    def age(self, value):
        if not 0 <= value <= 120:
            raise ValueError("Age must be between 0 and 120")
        self._age = value
p = Person(11)
p.age = 22

 

 

3.使用描述符( Descriptor ):更高级的属性控制方式

class MyDescriptor:
    def __get__(self, instance, owner):
        print("Getting descriptor")
        return "Default value"

    def __set__(self, instance, value):
        print(f"Setting descriptor to {value}")

class MyClass:
    attribute = MyDescriptor()

my_instance = MyClass()
# 获取属性值,触发 __get__ 方法
print(my_instance.attribute)  
# 设置属性值,触发 __set__ 方法
my_instance.attribute = "New value"  

 

class ConfigValue:
    def __init__(self, min_value, max_value):
        self.min_value = min_value
        self.max_value = max_value

    def __get__(self, instance, owner):
        return instance.__dict__[self.name]

    def __set__(self, instance, value):
        if not self.min_value <= value <= self.max_value:
            raise ValueError(f"Value must be between {self.min_value} and {self.max_value}")
        instance.__dict__[self.name] = value

class Config:
    temperature = ConfigValue(0, 100)

config = Config()
# 设置有效的值
config.temperature = 50  
# 尝试设置无效的值,会触发异常
config.temperature = 150  

 

 

4.元类( Metaclass ):在类创建时控制属性的定义

class Meta(type):
    def __new__(cls, name, bases, attrs):
        if 'special_attribute' not in attrs:
            attrs['special_attribute'] = 'Default value'
        return super().__new__(cls, name, bases, attrs)
class MyClass(metaclass=Meta): pass

 

class DescriptorMeta(type):
    def __new__(cls, name, bases, attrs):
        for key, value in attrs.items():
            if hasattr(value, '__get__') and hasattr(value, '__set__'):
                attrs[key] = value
        return super().__new__(cls, name, bases, attrs)
class MyClass(metaclass=DescriptorMeta):
    attribute = MyDescriptor()

 

标签:__,控制,name,self,value,class,def,属性
From: https://www.cnblogs.com/zwx901323/p/18598755

相关文章

  • 为什么代码中两个`display`属性为`inline-block`的元素之间有多余字符(包括换行、制表
    display:inline-block元素之间的空隙是由HTML源代码中的空格、换行符和制表符引起的。浏览器会将这些空白字符渲染成一个空格,就像普通的文本一样。由于inline-block元素像行内元素一样排列,它们之间的空格也会被保留并显示出来。解决方案:移除HTML源代码中的空白字符:......
  • 51单片机基础之LED彩灯控制系统
    (一)显示界面数码管需要A和B,则需要在数码管段选数据储存数组添加0x77与0x7f(二)按键功能按键需要启动,暂停,则需要创建一个bit类型标志位,进行判断,实现四个模式的切换,需要定义模式的变量,用switch列举出来(三)彩灯模式34模式需要一个从外到内的LED数据数组,并建立一个用于遍历数组......
  • 【C++】控制台清空/清除部分字符
    目录清空整个屏幕:清空特定的某一行:(附录)一些常用的ANSI转义码清空整个屏幕:(头文件<cstdlib>)system(“cls”);*该方法容易造成闪屏等问题,可以尝试用WIN-API函数解决(?)      /待研究清空特定的某一行:若是清空方才输出的那一行     使用 \r  将......
  • 【语法】类属性与实例属性
    类属性在Python的面向对象编程中是一个与类本身相关联的变量,而不是与类的特定实例(即对象)相关联。这意味着,无论创建了多少个类的实例,它们访问的都是同一个类属性值。类属性通常用于存储与类本身相关但不需要与特定实例相关联的数据,或者用于在类的所有实例之间共享数据。以下是关于......
  • CSS flex 子项目中的 flex 属性家族
    CSSflex子项目中的flex属性家族零、参考文章一文搞懂flex属性聊聊Flexbox布局中的flex的演算法一、基础概念语法flex是简写语法,其作用是设置弹性项目如何增大或缩小以适应其弹性容器中可用的空间,其具体代表是:flex-grow:扩展子元素长度flex-shrink:收缩子元素长度......
  • 贴砖(即铺设大瓷砖)是一项常见的建筑施工工作,涉及到墙面和地面的装饰。为了保证施工质量
    贴砖(即铺设瓷砖)是一项常见的建筑施工工作,涉及到墙面和地面的装饰。为了保证施工质量和持久性,必须遵守相应的施工规范。以下是贴砖施工的一些基本规范,涵盖了操作步骤、材料要求以及质量控制等方面。1. 施工准备工具准备:常用工具包括水平尺、橡皮锤、钢丝刷、铲刀、砖刀、电动搅......
  • 贴砖工程的验收规范主要依据国家和行业的相关标准,确保施工质量符合设计要求,并确保使用
    贴砖工程的验收规范主要依据国家和行业的相关标准,确保施工质量符合设计要求,并确保使用中的安全性和耐久性。下面是一些关键的验收规范和标准,涵盖了瓷砖铺设的质量控制、检测方法、合格标准等方面。1. 主要参考规范与标准《建筑装饰装修工程质量验收规范》(GB50210)《建筑工程......
  • ABB机器人控制信号电缆故障维修方法详解
    一、引言ABB机器人作为自动化生产线上的重要组成部分,其控制信号电缆负责传输关键的控制信号和数据,对机器人的正常运作起着至关重要的作用。然而,在长时间的运行过程中,由于环境、老化或人为操作等多种因素,控制信号电缆可能会出现故障。本文将详细介绍ABB机器人控制信号电缆的常见故......
  • 2024-12-5实现16音阶按钮控制并显像管显示字符
    单片机的4*4按钮是根据PIN口的高四位和低四位实现的。(其中第几位返回0,显示第几行/列)我们可以根据btn去存贮其高四位和低四位实现知道第几排第几列。即可得到一下代码。//需要自行学习中断相关知识才可以理解interrupt的内容(这里不再赘述)#include<reg51.h>sbitSOUNDER=P3......
  • 【StableDiffusion教程】AI绘画探索:通过Stable Diffusion实现角色稳定控制与线稿上色
    在角色控制方面,我们都了解到midjourney的局限性,其无法稳定地实现目标控制。然而,StableDiffusion提供了出色的可控性,使我们能够有效地弥补这一缺陷。今天就通过一个简单案例,给大分享如何使用StableDiffusion中的ControlNet插件实现角色稳定控制与线稿上色。(文末扫码......