对象如何访问其所有者的全局?

时间:2014-12-11 03:36:34

标签: python

如果我们有类似的话:

foo.py

from bar import bar

class foo:
    global black;
    black = True;

    bar = bar()

    bar.speak()

f = foo()

bar.py

class bar:
    def speak():
    if black:
        print "blaaack!"
    else:
        print "whitttte!"

我们跑的时候 python foo.py

我们得到了

NameError: global name 'black' is not defined

做这样的事情的最佳做法是什么?

我应该在方法中传递它吗?

bar类有父变量吗?

对于上下文,实际上black全局用于调试步骤。

2 个答案:

答案 0 :(得分:1)

在Python中,全局变量特定于模块。所以你的foo.py中的全局不能在你的bar.py中访问 - 不是你至少写过它的方式。

如果您希望foo的每个实例都有自己的black值,那么请使用Ivelin显示的实例变量。如果您希望foo的每个实例共享black的相同值,请使用类变量。


使用实例变量:

# foo.py
from bar import bar

class foo:
    # Python "constructor"..
    def __init__(self):
        # Define the instance variables
        self.bar = bar()
        # Make bar talk
        self.bar.speak()

    # Create a function for making this foo's bar speak whenever we want
    def bar_speak(self):
        self.bar.speak()

################################################################################
# bar.py
class bar:
    # Python "constructor"..
    def __init__(self):
         # Define the instance variables
        self.black = True
    def speak(self):
        if self.black:
            print "blaaack!"
        else:
            print "whitttte!"

玩代码:

>>> f = foo()
blaaack!
>>> b = foo()
blaaack!
>>> b.bar.black = False
>>> b.bar_speak()
whitttte!
>>> f.bar_speak()
blaaack!

使用类变量:

# foo.py
from bar import bar

class foo:
    # Python "constructor"..
    def __init__(self):
        # Define the instance variables
        self.bar = bar()
        # Make bar talk
        self.bar.speak()

    # Create a function for making this foo's bar speak whenever we want
    def bar_speak(self):
        self.bar.speak()

################################################################################
# bar.py
class bar:
    black = True
    def speak():
        if bar.black:
            print "blaaack!"
        else:
            print "whitttte!"

玩代码:

>>> f = foo()
blaaack!
>>> b = foo()
blaaack!
>>> bar.black = False
>>> b.bar_speak()
whitttte!
>>> f.bar_speak()
whitttte!

答案 1 :(得分:0)

这是我要做的:

foo.py

from bar import bar

class foo:
    bar = bar(black=True)
    bar.speak()

f = foo()

bar.py

class bar:
    def __init__(black):
        self.black = black
    def speak():
        if self.black:
            print "blaaack!"
        else:
            print "whitttte!”