簡體   English   中英

Python:內部 Class

[英]Python: Inner Class

我正在嘗試從 class 創建 json 字符串,並且我將 class 定義如下:

import json
import ast
from datetime import datetime
import pytz
import time

class OuterClass:
    def __init__(self):
        self.Header = None
        self.Body = None

    class Header:
        def __init__(self, ID = None, Name = None):
            self.ID =  ID
            self.Name = Name 

    class Body:
        def __init__(self, DateTime=None, Display=None):
            self.DateTime = DateTime
            self.Display = Display

def current_time_by_timezone(timezone_input):
    return datetime.now(pytz.timezone(timezone_input))

if __name__ == '__main__':
    response = OuterClass()
    header = response.Header('123', 'Some Name')
    body = response.Body(current_time_by_timezone('US/Central'), 'NOT VALID')
    print(json.dumps(response.__dict__))

我收到錯誤“TypeError: 'NoneType' object is not callable”。 是因為我自己將 OuterClass 定義中的 Header 和 Body 設置為 None 嗎?

您的代碼的問題是以下幾行:

    self.Header = None
    self.Body = None

這些在OuterClass的每個實例上創建名為HeaderBody的實例變量,因此您永遠不能通過實例訪問 class 變量(嵌套類),只能通過OuterClass本身。

您對這個數據結構的意圖不是很清楚。 在另一個 class 中定義一個 class 在 Python 中沒有做任何特殊的事情(默認情況下,您可能通過特殊的努力使內部類具有特殊行為,例如使用使內部類成為描述符的特殊行為)。 不過,一般來說,類之間沒有隱含的關系。

如果您希望您的OuterClass創建其他兩個類的實例,您可以在不嵌套它們的定義的情況下這樣做。 只需將 class 定義放在頂層並編寫一個在適當時間創建實例並對其執行一些有用操作的方法(例如將其綁定到實例變量)。

你可能想要這樣的東西:

def Header:
   ...

def Response:
   def __init__(self):
       self.header = None

   def make_header(self, *args):
       self.header = Header(*args)
       return self.header

只要您不希望這意味着任何特殊,您就可以保持類嵌套,只要確保您不使用 class 名稱作為實例變量,否則您將隱藏嵌套 class 的名稱(a大小寫差異,例如self.headerself.Header就足夠了)。

暫無
暫無

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

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