簡體   English   中英

從另一個類訪問類變量

[英]Access class variables from another class

我有一個簡單的類A,它從用戶那里獲取名稱。

class A:
   def __init__(self, name = ''):
       self.name = name

然后,我想創建一個打印此名稱的類B。 我試過了:

class B:
    def print_name(printing_name = A.name):
        print(printing_name)

然后我調用這些方法:

m1 = A("x")
B.print_name(m1)

這將返回錯誤

Traceback (most recent call last):
  File "so.py", line 5, in <module>
    class B:
  File "so.py", line 7, in B
    def print_name(printing_name = A.name):
AttributeError: class A has no attribute 'name'

我知道我沒有在類A中分配類變量,因此name屬性與特定實例一起使用,而不是與整個類一起使用。 但是,名稱屬性必須與每個特定實例連接,因為它隨情況而變化。 那我該如何在B類中獲得這個名字?

將您的class B更改為:

class B:

    @staticmethod
    def print_name(obj):
        print(obj.name)

print_name方法可能應該修飾為“靜態方法” self的屬性“ name ”是一個實例屬性,不能直接從類本身進行引用。

沒錯: name是實例屬性,而不是類屬性。 在這種情況下, m1有一個名稱,但類A沒有。 您需要訪問輸入參數的名稱,而不是嘗試打印類屬性。

您還需要使B.print_name成為類函數,因為您不是從B的實例調用它。

class B:

    @staticmethod
    def print_name(inst):
        print(inst.name)

輸出:

x

編輯:如果您了解@staticmethod的答案,那么它是理想的選擇。

class A:
    def __init__(self, name = ''):
        self.name = name

class B:
    def __init__(self):
        pass
    def print_name(self, var):
        print (var.name)

輸出:

>>> m1 = A("X")
>>> b = B()
>>> b.print_name(m1)
X
>>>

在這種情況下,A是類的名稱,您不應將其作為調用print_name方法的默認參數。 看一下Python的關鍵字參數,您會發現實際上編寫的內容意味着您已將默認值設置為A類的.name屬性,除非實例化該類(否則,否則該對象不存在)是由該類創建的)。

您的B課應為:

class B:
    def print_name(printing_object):
        print(printing_object.name)

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM