自定义字典实现属性可以通过 对象.key的方式调用

该文章展示了如何通过在Python类中实现`__init__`和`__getitem__`魔术方法,使对象能通过`.key`方式调用属性。`__getitem__`方法允许通过`[key]`访问值,而`__getattr__`通常不需要实现,因为默认行为已能处理字典中的属性访问。
摘要由CSDN通过智能技术生成

自定义字典实现属性可以通过 对象.key的方式调用

class A():
    def __init__(self):
        self.name =2

    def __getitem__(self, item):
        """
        字典的魔术方法,实现此就可以通过: 对象['key']获取值
        """
        print("__getitem__")
        return self.__dict__[item]

    # def __getattr__(self, item):
    #     """
    #        魔术方法,实现此就可以通过: 对象.key 获取值,一般不需要实现
    #      """
    #     print("__getattr__")
    #     return self.__dict__[item]

a=A()
print(a.name)
print(a['name'])
如果你想对不同返回值对象中的不同属性添加自定义注解,并且只对有自定义注解的字段进行数据字典的格式化,你可以使用反射来实现。下面是一个示例的 Java 代码: 首先,你需要定义一个自定义注解 `DataDictionaryField`,用于标记需要进行数据字典格式化的字段: ```java import java.lang.annotation.ElementType; import java.lang.annotation.Retention; import java.lang.annotation.RetentionPolicy; import java.lang.annotation.Target; @Retention(RetentionPolicy.RUNTIME) @Target(ElementType.FIELD) public @interface DataDictionaryField { } ``` 接下来,你需要修改 `DataDictionary` 类,使其能够根据字段上的自定义注解进行格式化操作: ```java import org.springframework.stereotype.Component; import java.lang.reflect.Field; import java.util.HashMap; @Component public class DataDictionary { private HashMap<String, String> dictionary; public DataDictionary() { dictionary = new HashMap<>(); // 添加键值对到数据字典 dictionary.put("name", "John"); dictionary.put("age", "25"); dictionary.put("city", "New York"); } public String getValue(String key) { // 检查数据字典中是否包含指定的键 if (dictionary.containsKey(key)) { // 获取指定键的值 return dictionary.get(key); } else { return null; } } public void formatObject(Object obj) { // 获取对象的类 Class<?> clazz = obj.getClass(); // 获取所有字段 Field[] fields = clazz.getDeclaredFields(); // 遍历字段 for (Field field : fields) { // 检查字段是否有 DataDictionaryField 注解 if (field.isAnnotationPresent(DataDictionaryField.class)) { // 设置字段可访问 field.setAccessible(true); try { // 获取字段的值 Object value = field.get(obj); if (value instanceof String) { // 根据数据字典进行格式化操作 String formattedValue = getValue((String) value); if (formattedValue != null) { // 将格式化后的值设置回字段 field.set(obj, formattedValue); } } } catch (IllegalAccessException e) { e.printStackTrace(); } } } } } ``` 在上述代码中,我们修改了 `DataDictionary` 类,添加了一个新的方法 `formatObject`,用来根据字段上的自定义注解进行格式化操作。在该方法中,我们首先获取对象的类和所有字段,然后遍历字段,检查字段是否有 `DataDictionaryField` 注解。如果有注解,我们将字段设置为可访问,并获取字段的值。如果值是 `String` 类型,并且存在对应的数据字典值,我们将格式化后的值设置回字段。 最后,你可以在切面类中调用 `DataDictionary` 类的 `formatObject` 方法来进行格式化操作: ```java import org.aspectj.lang.annotation.AfterReturning; import org.aspectj.lang.annotation.Aspect; import org.aspectj.lang.annotation.Pointcut; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.stereotype.Component; @Aspect @Component public class ReturnValueFormattingAspect { @Autowired private DataDictionary dataDictionary; @Pointcut("execution(* com.example.YourService.*(..))") public void serviceMethods() {} @AfterReturning(pointcut = "serviceMethods()", returning = "returnValue") public void formatReturnValue(Object returnValue) { dataDictionary.formatObject(returnValue); } } ``` 在上述代码中,我们在切面类的 `formatReturnValue` 方法中调用了 `DataDictionary` 类的 `formatObject` 方法,将返回值对象作为参数传递给它进行格式化操作。 请注意,上述代码中的 `com.example.YourService.*(..)` 部分需要替换为你实际项目中的服务类和方法的包名和方法名。 希望这个示例能帮助到你在 Spring Cloud 项目中根据自定义注解对返回值对象中的字段进行数据字典的格式化。请根据你的具体场景进行调整和扩展。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值