Альтернатива poseAsClass в Mac OS X 10.5 и выше?

Если я понимаю Вашу ситуацию правильно, что Вы видите, результат того, как Python обрабатывает локальный (функциональный) и глобальный (модуль) пространства имен.

Говорят, что у Вас есть модуль как это:

# sample.py
myGlobal = 5

def func1():
    myGlobal = 42

def func2():
    print myGlobal

func1()
func2()

Вы могли бы, ожидая, что это распечатает 42, но вместо этого это печатает 5. Как был уже упомянут, если Вы добавите' global' объявление к func1(), то затем func2() распечатает 42.

def func1():
    global myGlobal
    myGlobal = 42

, Что продолжается, вот то, что Python берет то любое имя, которое является присвоено [1 113], где угодно в функции, локально для той функции, если явно не сказали иначе. Если это будут только [1 114] чтение с имени, и имя не существует локально, то это попытается искать имя в любом содержащем объемы (например, глобальная область видимости модуля).

, Когда Вы присваиваете 42 имени myGlobal, поэтому, Python создает локальную переменную что тени глобальная переменная того же имени. То локальное выходит из объема и , собрал "мусор" когда func1() возвраты; между тем, func2() ничего никогда не может видеть кроме (неизмененного) глобального имени. Обратите внимание, что это решение пространства имен происходит во время компиляции, не во времени выполнения - если бы необходимо было считать значение myGlobal внутренний func1() перед присвоением ему то Вы добрались бы UnboundLocalError, потому что Python уже решил, что это должна быть локальная переменная, но оно еще не имело никакого значения, связанного с ним. Но при помощи' global' оператор, Вы говорите Python, что он должен в другом месте искать имя вместо того, чтобы присвоить ему локально.

(я полагаю, что это поведение, порожденное в основном посредством оптимизации локальных пространств имен - без этого поведения, VM Python, должно было бы выполнить по крайней мере три поиска имени каждый раз, новое имя присвоено внутренней части функция (чтобы гарантировать, что имя уже не существовало на уровне модуля / встроенном уровне), который значительно замедлит очень общую операцию.)

6
задан Kara 6 December 2013 в 05:08
поделиться

3 ответа

Я не думаю, что есть эквивалент на уровне класса, но вы можете поменять реализацию двух методов, что часто было цель использования PoseAsClass: (конечно, вы можете обмениваться более чем одним методом, если вам нужно переопределить несколько методов в классе). Вы хотите method_exchangeImplementations в среде выполнения Objective-C 2.0 ( #import objc / runtime.h ). Предупреждение: после вызова method_exchangeImplementations вызов «нового» метода фактически вызывает определение исходного метода.

8
ответ дан 8 December 2019 в 13:48
поделиться

Lap Cat дает альтернативу.

7
ответ дан 8 December 2019 в 13:48
поделиться

Что вы пытаетесь сделать? Часто есть способы позировать. Однако я признаю, что иногда это единственный способ :)

2
ответ дан 8 December 2019 в 13:48
поделиться
Другие вопросы по тегам:

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