OOP Python -- 从构造函数参数或成员函数初始化成员变量?

OOP Python -- initializing member variables from constructor parameters or from member functions?

我在这个项目中有多个 classes,他们都面临着我将要解释的相同情况。为了简化事情,我将使用一个 class 及其具体情况的详细信息。

Class

class ConnectedDevice(object):
    def __init__(self, mac_address, ip_address):
        self.mac_address = mac_address
        self.ip_address = ip_address

解决此问题的方式 # 1

我可以构造实例,成员变量通过构造函数的参数填充。

这可以通过在 main 中的 class 之外设置单独的函数来完成,这些函数可以获取必要的信息。

def main():

    mac_address = get_mac_address()
    ip_address = get_ip_address()

    Device0 = ConnectedDevice(mac_address, ip_address)

解决此问题的方式 # 2

我可以在构造函数的参数中构造带有 None 的实例,并在事后使用成员函数来填充成员变量。显然,我会在 class 中定义成员函数来这样做。

def main():

    Device0 = ConnectedDevice(None, None)

    Device0.set_mac_address()
    Device0.set_ip_address()

问题

我想问哪种面向对象的方法更好?

这不是见仁见智吗?我会说 "Way to Go About This #2" 是个坏主意,因为代码不是为了只使用一次而编写的,有一天你或其他人可能想要使用 ConnectedDevice 并且可能在未初始化的情况下无意中使用它时尚。即使您知道应该如何完成,也可能会失误。

无论如何,恕我直言,一个更好的方法是 "Way to Go About This #3":

def main():

    Device0 = ConnectedDevice(get_mac_address(), get_ip_address())

...如果构造函数接收到任一参数的 None,则引发异常。 (但这就是我的口味。)