2016-07-24 7 views
1

getattrに似た関数を実装したいと思いますが、ドット付き文字列を受け取り、各属性をトラバースします。点列の文字列を受け入れる関数 `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') 

これを行うための組み込み方法はありますか?可能性のあるすべての例外やエッジケースを処理するために、上記のコードでどのような改善を行うことができますか?

答えて

0

はい、「組み込みの方法」があります。プロパティデコレータを使用できます。 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) 

結果:

[email protected]:~/tmp$ python3 propery_test.py 
ubik 
Philip Kindred Dick 
関連する問題