В моем случае (на основе предыдущего) возможно любое количество уровней.
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"]
Это потому, что согласно документации :
Значения параметров по умолчанию оцениваются при выполнении определения функции. Это означает, что выражение оценивается один раз, когда функция определена
blockquote>Когда определено
__init__()
, определениеMyClass
является неполным, поскольку оно все еще анализируется, поэтому вы можете Пока не указывайтеMyClass.__DefaultName
. Один из способов обойти это - передать особое уникальное значение__init__()
, напримерNone
:def __init__(self, name=None): if name is None: name = MyClass.__DefaultName # ...
Важно помнить, что с 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')