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()
问题
我想问哪种面向对象的方法更好?
- 解决此问题的方法 # 1
- 如何解决这个问题 # 2
这不是见仁见智吗?我会说 "Way to Go About This #2" 是个坏主意,因为代码不是为了只使用一次而编写的,有一天你或其他人可能想要使用 ConnectedDevice
并且可能在未初始化的情况下无意中使用它时尚。即使您知道应该如何完成,也可能会失误。
无论如何,恕我直言,一个更好的方法是 "Way to Go About This #3":
def main():
Device0 = ConnectedDevice(get_mac_address(), get_ip_address())
...如果构造函数接收到任一参数的 None
,则引发异常。 (但这就是我的口味。)
我在这个项目中有多个 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()
问题
我想问哪种面向对象的方法更好?
- 解决此问题的方法 # 1
- 如何解决这个问题 # 2
这不是见仁见智吗?我会说 "Way to Go About This #2" 是个坏主意,因为代码不是为了只使用一次而编写的,有一天你或其他人可能想要使用 ConnectedDevice
并且可能在未初始化的情况下无意中使用它时尚。即使您知道应该如何完成,也可能会失误。
无论如何,恕我直言,一个更好的方法是 "Way to Go About This #3":
def main():
Device0 = ConnectedDevice(get_mac_address(), get_ip_address())
...如果构造函数接收到任一参数的 None
,则引发异常。 (但这就是我的口味。)