【问题标题】:python `getattr` like function that accepts dotted stringpython`getattr`之类的函数接受点分字符串
【发布时间】:2023-03-27 20:37:01
【问题描述】:

我想实现一个类似于getattr的函数,但会接受一个点分字符串并遍历每个属性。

def getattr_multiple_level(obj, attr_string):
    attr_names = attr_string.split('.')
    next_level = obj
    for attr_name in attr_names:
        next_level = getattr(next_level, attr_name)
    return next_level

class Test():
    def make_name(self, pre, suffix=""):
        return str(pre) + "_my_office_" + suffix


p = Test()
p.room = Test()
p.room.office = Test()

attr = getattr_multiple_level(p, 'room.office.make_name')

是否已经有内置方法可以做到这一点?或者在上面的代码中可以做哪些改进来处理所有可能的异常和边缘情况?

【问题讨论】:

    标签: python oop object attributes


    【解决方案1】:

    是的,有“内置方式”。您可以使用属性装饰器。 https://docs.python.org/2/library/functions.html#property

    class Author(object):
    
        def __init__(self, full_name):
            self.full_name = full_name
    
    
    class Book(object):
    
        def __init__(self, name):
            self.name = name
    
        @property
        def author(self):
            return Author("Philip Kindred Dick")
    
    class Library(object):
    
        @property
        def book_ubik(self):
            return Book("ubik")
    
    
    library = Library()
    
    print(library.book_ubik.name)
    print(library.book_ubik.author.full_name)
    

    结果:

    grzegorz@grzegorz-GA-78LMT-USB3:~/tmp$ python3 propery_test.py 
    ubik
    Philip Kindred Dick
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2011-03-17
      • 1970-01-01
      • 1970-01-01
      • 2019-02-12
      • 2013-11-19
      • 2020-11-14
      • 1970-01-01
      • 2022-01-14
      相关资源
      最近更新 更多