我已将__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
任何建议都会很棒。
感谢。
答案 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;
}