Статический метод Python2 имеет параметр по умолчанию, ссылающийся на класс [duplicate]

В моем случае (на основе предыдущего) возможно любое количество уровней.

var myObj = {
    rrr: undefined,
    pageURL    : "BLAH",
    emailBox   : {model:"emailAddress", selector:"#emailAddress"},
    passwordBox: {model:"password"    , selector:"#password"},
    proba: {odin:{dva:"rr",trr:"tyuuu"}, od:{ff:5,ppa:{ooo:{lll:'lll'}},tyt:'12345'}}
};


function lookdeep(obj,p_Name,gg){
    var A=[], tem, wrem=[], dd=gg?wrem:A;
    for(var p in obj){
        var y1=gg?'':p_Name, y1=y1 + '.' + p;
        if(obj.hasOwnProperty(p)){
           var tem=obj[p];
           if(tem && typeof tem=='object'){
               a1=arguments.callee(tem,p_Name,true);
               if(a1 && typeof a1=='object'){for(i in a1){dd.push(y1 + a1[i])};}
            }
            else{
               dd.push(y1 + ':' + String(tem));
            }
        }
    };
    return dd
};


var s=lookdeep(myObj,'myObj',false);
for (var x=0; x < s.length; ++x) {
console.log(s[x]+'\n');}

результат:

["myObj.rrr:undefined",
"myObj.pageURL:BLAH",
"myObj.emailBox.model:emailAddress",
"myObj.emailBox.selector:#emailAddress",
"myObj.passwordBox.model:password",
"myObj.passwordBox.selector:#password",
"myObj.proba.odin.dva:rr",
"myObj.proba.odin.trr:tyuuu",
"myObj.proba.od.ff:5",
"myObj.proba.od.ppa.ooo.lll:lll",
"myObj.proba.od.tyt:12345"]
29
задан Mark Amery 10 January 2016 в 22:39
поделиться

2 ответа

Это потому, что согласно документации :

Значения параметров по умолчанию оцениваются при выполнении определения функции. Это означает, что выражение оценивается один раз, когда функция определена

Когда определено __init__(), определение MyClass является неполным, поскольку оно все еще анализируется, поэтому вы можете Пока не указывайте MyClass.__DefaultName. Один из способов обойти это - передать особое уникальное значение __init__(), например None:

def __init__(self, name=None):
    if name is None:
        name = MyClass.__DefaultName
    # ...
25
ответ дан Mark Amery 5 September 2018 в 10:40
поделиться

Важно помнить, что с Python , когда выполняются разные биты кода, а также то, что операторы class и def выполняются, когда видели , а не просто храниться позже. С def это немного легче понять, потому что единственное, что выполняется, - это то, что находится между () s, поэтому в вашем коде выше

def __init__( SELF, name = MyClass.__DefaultName ):

, когда Python видит MyClass.__DefaultName it пытается найти его сначала в пространстве имен local, затем в пространстве имен модуля (aka global) и, наконец, в builtins.

Что такое пространство имен local при выполнении функции class заявление? Это интересная часть - это то, что станет пространством имен class, но на данный момент оно анонимно, поэтому вы не можете ссылаться на него по имени (иначе MyClass в вашем коде), но вы можете прямо ссылается на все, что уже определено ... и что было определено? В вашем примере класса только одно - __DefaultName. Поэтому ваш __init__ должен выглядеть так:

def __init__( SELF, name=__DefaultName ):

Помните, что вы не можете изменить MyClass._MyClass__DefaultName позже, и эти изменения появятся в новых экземплярах. Зачем? Поскольку функция __init__ выполняется только один раз, и любое значение __DefaultName было в данный момент сохранено и всегда будет использоваться - если вы не укажете новое значение при создании нового экземпляра:

my_instance = MyClass(name='new name')
21
ответ дан Ethan Furman 5 September 2018 в 10:40
поделиться
Другие вопросы по тегам:

Похожие вопросы: