繁体   English   中英

在 Python 中增加 class 实例计数器

[英]Increment class instance counter in Python

我对 Python 不太熟悉,因为我有 Java 背景。 我有这个简单的 class:

## Class declaration
class SemVersion:
    major: int
    minor: int
    patch: int

    def __init__(self, major, minor, patch):
        self.major = major
        self.minor = minor
        self.patch = patch

    def incrementMinor(self):
        print(self)
        self.minor = self.minor + 1
        return self

    def toString(self):
        return self.major + "." + self.minor + "." + self.patch

    def toSnapshotString(self):
        return self.toString() + "-SNAPSHOT"

以下语句引发错误:

newDevelopVersion = releaseSemVersion.incrementMinor()

例外:

Traceback(最近一次调用最后一次):文件“C:\devenv\java\apps\vsb-letters-transfer-api\release_preprod.py”,第 41 行,在 newDevelopVersion = releaseSemVersion.incrementMinor() 文件“C:\devenv\ java\apps\vsb-letters-transfer-api\release_helpers.py",第 17 行,增量次要 self.minor = self.minor + 1 TypeError: can only concatenate str (not "int") to str

我想了解 Python 是如何设法不将其识别为 integer 的,因为我是这样声明的,只是按照我要求的方式增加。
我确信对此有一个合理的解释。
我看不出我是如何要求任何地方将字符串添加到 int 或任何类似性质的东西的。

非常感谢。

Python 不强制注释中的类型。 注释主要用于文档目的。

当您初始化 object 时,您可能会将str传递给构造函数,这会使解释器认为releaseSemVersion.minor是字符串而不是int


您可以通过在__init__()中添加检查来避免这种情况,如下所示

def __init__(self, major, minor, patch):
    if not isinstance(major, int):
        raise TypeError('major must by of type int')
    
    if not isinstance(minor, int):
        raise TypeError('minor must by of type int')
    
    if not isinstance(patch, int):
        raise TypeError('patch must by of type int')

    self.major = major
    self.minor = minor
    self.patch = patch

首先,使用Python时的一些注意事项:

  • Python 不强制类型,类型提示只是帮助您和其他人了解某些方法或 function 的预期

  • 变量和方法名称必须采用蛇形大小写格式,遵循snake_case描述的最佳实践

现在,重构您的示例,您应该能够执行所需的操作:

class SemVersion:
    major: int
    minor: int
    patch: int

    def __init__(self, major, minor, patch):
        self.major = major
        self.minor = minor
        self.patch = patch

    def increment_minor(self):
        self.minor = self.minor + 1
        return self

    def to_string(self):
        return self.major + "." + self.minor + "." + self.patch

    def to_snapshot_string(self):
        return self.toString() + "-SNAPSHOT"


# Your class instance
develop_vision = SemVersion(
    major=1, 
    minor=2, 
    patch=3
)

print(f"Initial value of minor: {develop_vision.minor}")

develop_vision.increment_minor()
develop_vision.increment_minor()

print(f"New value of minor: {develop_vision.minor}")

现在,如果你想检查你的构造函数 arguments 类型,pydantic 可以帮助你!

# Make sure that your virtual environment is active

$ pip3 install pydantic

调整您的 class 以使用 pydantic 验证

from pydantic import BaseModel, StrictInt


class SemVersion(BaseModel):
    major: StrictInt
    minor: StrictInt
    patch: StrictInt

    # You don't need build a constructure anymore, pydantic do it for you

    def increment_minor(self):
        self.minor = self.minor + 1
        return self

    def to_string(self):
        return self.major + "." + self.minor + "." + self.patch

    def to_snapshot_string(self):
        return self.toString() + "-SNAPSHOT"


# Your class instance
develop_vision = SemVersion(
    major=1, 
    minor=2, 
    patch='10'
)

print(develop_vision)

如果您尝试使用类似 '10' 的字符串运行此代码,您将从 pydantic 获得异常,如下所示:

Traceback (most recent call last):
  File "/home/jns/Desktop/stack.py", line 23, in <module>
    develop_vision = SemVersion(
  File "pydantic/main.py", line 341, in pydantic.main.BaseModel.__init__
pydantic.error_wrappers.ValidationError: 1 validation error for SemVersion
patch
  value is not a valid integer (type=type_error.integer)

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM