簡體   English   中英

在 Python 中,如何以與命名元組相同的方式表示一個類?

[英]In Python, how to represent a class in the same way named tuple does?

我最初使用命名元組編寫了一些代碼:

from collections import namedtuple


Count = namedtuple('Count', 'input_number multiple_of count remainder')


def get_count(input_number: int, multiple_of: int) -> Count:
    '''
    >>> get_count(100, 10)
    Count(input_number=100, multiple_of=10, count=10, remainder=0)
    >>> get_count(5, 6)
    Count(input_number=5, multiple_of=6, count=0, remainder=5)
    >>> get_count(999, 90)
    Count(input_number=999, multiple_of=90, count=11, remainder=9)
    '''
    count = input_number // multiple_of
    remainder = input_number % multiple_of
    return Count(
        input_number=input_number,
        multiple_of=multiple_of,
        count=count,
        remainder=remainder
    )

注意:當對象被打印時,它的格式是:Count(input_number=100,multiple_of=10,count=10,remall=0) 例如。

是否有 Pythonic / 最佳實踐方式以相同的方式表示普通類?

然后我想結合 python3.6+ 的輸入功能,發現我無法使用來自集合的 namedtuple 來做到這一點,所以我將 Count 類編輯為以下內容:

from typing import NamedTuple


class Count(NamedTuple):
    input_number: int
    multiple_of: int
    count: int
    remainder: int

我對需要兩個函數不太滿意,所以我開始了新的:

class GetCount():
    '''
    >>> GetCount(100, 10)
    GetCount(input_number=100, multiple_of=10, count=10, remainder=0)
    >>> GetCount(5, 6)
    GetCount(input_number=5, multiple_of=6, count=0, remainder=5)
    >>> GetCount(999, 90)
    GetCount(input_number=999, multiple_of=90, count=11, remainder=9)
    '''

    def __init__(self, input_number: int, multiple_of: int):
        self.input_number: int = input_number
        self.multiple_of: int = multiple_of
        self.count: int = input_number // multiple_of
        self.remainder: int = input_number % multiple_of

以我期望的方式獲得輸出的最佳方法是什么(請參閱預期輸出的 doctests)。

該問題的解決方案如下:

class GetCount():
    '''
    >>> GetCount(100, 10)
    GetCount(input_number=100, multiple_of=10, count=10, remainder=0)
    >>> GetCount(5, 6)
    GetCount(input_number=5, multiple_of=6, count=0, remainder=5)
    >>> GetCount(999, 90)
    GetCount(input_number=999, multiple_of=90, count=11, remainder=9)
    '''

    def __init__(self, input_number: int, multiple_of: int):
        self.input_number: int = input_number
        self.multiple_of: int = multiple_of
        self.count: int = input_number // multiple_of
        self.remainder: int = input_number % multiple_of

    def __repr__(self):
        return f"{self.__class__.__name__}({', '.join([f'{k}={v}' for k, v in self.__dict__.items()])})"

您可以通過運行以下命令看到提供的測試通過:

import doctest
doctest.testmod(verbose=True)

暫無
暫無

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

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