用__getattr__调用Python对象中的对象方法

时间:2018-01-06 21:51:54

标签: python magic-methods

我已将__getattr__(self, name)添加到允许我访问__dict__并返回属性的对象中,但我无法再调用对象方法。

我已尝试使用__魔术方法和getattr()进行各种组合,但似乎没有任何阻止maximum recursion depth exceeded while calling a Python object

这是当前的功能。注意:"值"而不是dict与未来的对象相关,所以我现在已经避免了 dict

class ParentClass():
   def __getattr__(self, prop):
        if prop not in getattr(self, "properties"):
           return # DO something here to get method, I think - self.__get__(prop)
        return getattr(self, "properties")[prop]

class SubClass():
    pass

任何建议都会很棒。

感谢。

1 个答案:

答案 0 :(得分:0)

Guide to Python's magic methods

中引用Rafe Kettler
  

__getattribute__(self, name)在完成所有这些之后,__getattribute__非常适合它   同伴__setattr____delattr__。但是,我不建议你使用它。   __getattribute__只能用于新式类(所有类都是新式的   最新版本的Python,在旧版本中,您可以创建一个新类型的类   通过子类化对象。它允许您为属性的值定义规则   被访问。它遇到了一些与其伙伴一样类似的无限递归问题   (这次你调用基类的__getattribute__方法来防止这种情况)。   它还主要避免了__getattr__的需要,__getattribute__class ParentClass(object): def __getattr__(self, prop): if prop in self.properties: return self.properties[prop] # the property is missing, do something else...   实现后,只有在显式调用或引发AttributeError时才会被调用。   可以使用此方法(毕竟,这是您的选择),但我不推荐它,因为它   有一个小用例(我们需要特殊行为来检索值的情况要少得多   而不是分配给它),因为实现无错误真的很难。

我认为你可以通过这样做来避免魔术方法:

function translate($transinfo) {

    $text = mb_strtolower($transinfo);

    $search1 = [[' der ',' die ',' das '],[' ein ',' eine ',' einer ', ' einem ', ' einen '],[' wer ', ' was ', ' wem ', ' wen ', ' wessen ', ' wohin ', ' woher ', ' wo '],[' ich ', ' du ','er ','sie ','es ','wir ','ihr '],[' an ',' bei ',' in ',' in ',' von ',' zu ',' auf ',' durch ',' für ',' hinter ',' über ',' um ',' unter ',' vor ',' am ',' bei ',' im ',' vom ',' zum ']];
    $replace = [          ' %1 ',                            ' %2 ',                                                       ' %3 ',                                                              ' %4 ',                                                                                           ' %5 '];
    $newtext = $text;
    for($i=0; $i<count($search1); $i++){
        $newtext = str_replace($search1[$i], $replace[$i], $newtext);
    return translate1($newtext);}
}

function translate1($transinfo)
{
    $text = $transinfo;
    $search =  ['c', 'bb', 'b', 'e', 'f', 'h', 'i', 'j', 'g', 'l', 'n', 'o', 'p', 'q', 't', 'v', 'w', 'x', 'y', 'z', 'ä', 'ö', 'ü', 'ß'];
    $replace = ['cr', 'c', 'c', 'a', 'e', 'cr', 'e', 'e', 'k', 'lc', 'm', 'u', 'c', 'cr', 'k', 'au', 'e', 'cy', 'c', 'kr', 'a', 'u', 'cr', 'cr'];
    $newtext = str_replace($search, $replace, $text);


    $newtext = (translates2(translates2(translates2(translates2(translates2(translates2(translates2(translates2(translates2(translates2($newtext)))))))))));
    return translate3($newtext);
}

function translates2($transinfo)
{
    $text = $transinfo;
    $search = ['das', 'emk', 'scl', 'crcr', 'ee', 'au', 'eu', 'ea', 'cc', 'amk', 'ae', 'lclc', 'ss', ' kc', 'crc', 'mm', 'ue', ' dc', 'uu', 'krcd', 'krd', 'rkr', 'rr', 'clc', 'kam ', 'kam.'];
    $replace = ['das', 'z', 'y', 'lc', 'z', 'r', 'r', 'cy', 'ec', 'z', 'y', 'y', 'cr', " k'c", 'z', 'e', 'cr', " d'c", "u'u", 'k', 'c', 'cr', 'lc', 'cr', 't ', 't.'];
    $newtext = str_replace($search, $replace, $text);


    return $newtext;
}

function translate3($transinfo) {
    $text = $transinfo;

    $search =  ['%1',  '%2',  '%3' ,  '%4', '%5'];
    $replace = ["k'c", "c'k", "o'qe", 'qe', "qe'o"];

    $newtext = str_replace($search, $replace, $text);

    return $newtext;
}