【问题标题】:Overloading constructors in Python [duplicate]在Python中重载构造函数[重复]
【发布时间】:2019-09-28 02:10:16
【问题描述】:

简单地说,构造函数在Python中重载的最简洁或最常用的方式是什么?

我有 C# 方面的经验,并且是 Python 新手,所以我仍在学习 Python 的最佳实践。

C# 有一种非常简洁的构造函数重载方式,因此我可以处理在初始化时作为参数传递的不同数据类型。我已经看到很多关于如何在 Python 中实现类似结果的不同答案,并且我不希望构造函数中的默认参数或逻辑来处理不同的数据类型!!!我不明白为什么人们推荐这个作为替代方案。

这是一些 C# 代码,我基本上想在 Python 中做同样的事情。

class SomeClass{

    int a;
    double b;
    string c;

    public SomeClass(int value1, double value2)
    {
        a = value1
        b = value2
    }

    public SomeClass(int value1, string value2)
    {
        a = value1
        c = string
    }
}

上面的代码只是一个例子。我知道有一些技巧,例如测试参数类型并将此逻辑添加到我的构造函数或接受 Python 不是强类型并在我的类方法中编写逻辑以了解如何处理不同类型的 value2。

但是,我正在编写的代码并不像上面的那么简单。我想处理如何处理不同对象或数据类型的参数。我想重载我的构造函数来处理不同类和数据类型的对象,即我可以传递 MyObject 或 JSON 文件或文本文件/CSV 文件等对象。

而且我不想要一个 hacky if 语句来测试 JSON 文件是否通过。这是因为用于传递 CSV 文件的构造函数可能包含更多参数和/或与传递 JSON 文件不同的参数。

我发现 C# 处理重载构造函数的方式更加简洁,因为我以后可以轻松地向 JSON 文件构造函数添加更多参数,而我只需要摆弄一个构造函数!

我确定 Python 有一种非常简洁的方式来实现相同的目标...?

我突然想到,Python 中可能不存在重载,因为它不是静态类型的。因此我假设类方法最适合我的目的。_

class SomeClass(object)

    @classmethod
    def fromtextfilename(cls, textfile):
        # Logic here
        return cls(data)

    @classmethod
    def fromtextfilename(cls, jsonfile):
        # Logic here
        return cls(data)

    __int__(self,data)
        # Use data to populate properties

【问题讨论】:

  • Python 没有方法重载。通常,您会使用 @classmethod 来使用备用构造函数
  • 另外,Python 是类型的,它只是动态类型而不是静态类型。
  • @Dennis Yer 我确实首先阅读了这个......有很多替代答案,我没有选择投票最多的答案,确实有我需要的答案,类方法只是没有'不包括任何参数,我认为这让我感到困惑......

标签: python


【解决方案1】:

假设你有一个班级Book

class Book:
    def __init__(self, title, author, pages):
        self.title = title
        self.author = author
        self.pages = pages

现在,您希望使用一个返回图书数据的 Web API,并希望直接从 API 的 JSON 响应中实例化一个 Book 对象。您必须更改 init 方法并添加检查。

class Book:
    def __init__(self, title = None, author = None, pages = None, book_as_json = None):
    if book_as_json:
        book = json.loads(book_as_json)
        self.title = book['title']
        self.author = book['author']
        self.pages = book['pages']
    else:
        self.title = title
        self.author = author
        self.pages = pages

但是按照行业标准,这种方法并不好。因此,用户可以尝试使用@classmethod装饰器

class Book:
    def __init__(self, title, author, pages):
        self.title = title
        self.author = author
        self.pages = pages

    @classmethod
    def from_json(cls, book_as_json):
        book = json.loads(book_as_json)
        return cls(title=book['title'], author=book['author'], pages=book['pages'])

详细说明见this link

【讨论】:

  • 对于那些对奇怪的分号和->感到困惑的人,那些是type hints,在这种情况下基本上不会以任何方式影响代码。
  • 为了更清楚,因为大多数人不熟悉类型提示,我已经删除了它。感谢您指出这一点!
  • 这将是我最初的评论“建议您删除它们”,但结果我最终了解了它们。无论如何+1
  • 链接已损坏 (404)。
  • @Deadpool 我会保留类型提示。为了编写可读代码,绝对应该使用它们。
猜你喜欢
  • 2020-09-21
  • 1970-01-01
  • 2012-07-22
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2017-01-10
  • 1970-01-01
相关资源
最近更新 更多