【问题标题】:using variables in class functions in another class (python)在另一个类的类函数中使用变量(python)
【发布时间】:2012-06-06 06:21:27
【问题描述】:

我想在一个类的函数中使用我在另一个类中声明的变量。

例如,我想在另一个类中使用变量“j”。可能吗? (我在某处读到它可能与实例变量有关,但完全无法理解这个概念)。

class check1:
    def helloworld(self):
        j = 5

【问题讨论】:

  • 在这种情况下(在类定义中)编写的“函数”称为“方法”。在 python 中,默认情况下,函数是“实例”方法。 “实例方法”的第一个参数(在这种情况下,self 始终是定义它的类的“实例”(例如,selfcheck1 对象)。通过执行 @987654325 @,您可以使该值对引用此特定self 的任何内容可见。
  • @Darthfett 你应该把它写成答案。

标签: python class instance-variables


【解决方案1】:

使用类继承很容易“共享”实例变量

示例:

class A:
    def __init__(self):
        self.a = 10

    def retb(self):
        return self.b

class B(A):
    def __init__(self):
        A.__init__(self)
        self.b = self.a

o = B()
print o.a
print o.b
print o.retb()

【讨论】:

  • 从类继承如何让您共享在实例上定义的变量?
  • 我添加了一个示例,两个类使用继承共享彼此的实例变量
  • A.a 是类变量,不是实例变量。
  • 这是一个例子。但是我在示例中的一个实例中更改了类变量。
【解决方案2】:
class check1:
    def helloworld(self):
        self.j = 5

check_instance=check1()
print (hasattr(check_instance,'j'))  #False -- j hasn't been set on check_instance yet
check_instance.helloworld()          #add j attribute to check_instance
print(check_instance.j)  #prints 5

但您不需要方法来为类实例分配新属性...

check_instance.k=6  #this works just fine.

现在您可以像使用任何其他变量一样使用check_instance.j(或check_instance.k)。

在您了解这一点之前,这似乎有点像魔术:

check_instance.helloworld()

完全等价于:

check1.helloworld(check_instance)

(如果您稍微考虑一下,这就解释了self 参数是什么)。

我不完全确定您要在这里实现什么 - 还有类变量由类的所有实例共享...

class Foo(object):
    #define foolist at the class level 
    #(not at the instance level as self.foolist would be defined in a method)
    foolist=[]  

A=Foo()
B=Foo()

A.foolist.append("bar")
print (B.foolist)  # ["bar"]
print (A.foolist is B.foolist) #True -- A and B are sharing the same foolist variable.

【讨论】:

  • 我不会花太多精力来回答这个“问题”。提问的用户在发布问题后从未接受过答案、发表过任何评论或进行过任何其他活动……不过答案很好。
  • @chown :您可能是对的,但即使用户没有任何活动,我也总是希望他/她能从阅读我的帖子中学到一些东西。
  • @chown 我没有对问题发表评论这一事实意味着我接受了它。尽管我之前已经对一两个问题发表了评论(当时我仍然对此感到困惑)。
  • @mgilson 感谢您的解决方案!我不能将类变量用于我的特定解决方案。我想要实现的是让我的谷歌应用引擎继续工作。我认为有 30 秒左右的处理超时,所以我计划在处理过程中重定向到另一个页面,但我仍然需要从前一页访问一些变量。我希望这个解决方案适用于它! (:
  • 但我感觉我可能无法使用这个解决方案,因为显然当我说“check_instance.helloworld()”之类的东西时,它会运行整个函数/方法“helloworld”(如果我错了),我基本上会回到第一方? (因为我显然不想在重定向页面中再次处理整个函数/方法。)
【解决方案3】:

j 不能被其他班级看到;但是,我认为您的意思是self.j,可以。

class A(object):
    def __init__(self, x):
        self.x = x

class B(object):
    def __init__(self):
        self.sum = 0
    def addA(self, a):
        self.sum += a.x

a = A(4)
b = B()
b.addA(a)    # b.sum = 4

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-03-30
    • 2014-10-06
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多