如何在实例化类时重写__init__方法中定义的属性?
如何在实例化时重写Python类__init__中定义的属性?
问题背景
你有这样一个类:
class MyFunObject(object): def __init__(self): self.url = "http://myurl.com"
尝试通过以下代码实例化并传入自定义url时触发了错误:
server = MyFunObject(url="http://www.google.com")
错误信息:
TypeError: __init__() got an unexpected keyword argument 'url'
解决方案
当然可以重写这个属性!报错的原因是你的__init__方法没有声明接受url这个参数,所以实例化时传入它会被判定为意外参数。下面是几种实用的解决方法:
方法1:修改__init__方法,添加带默认值的url参数
这是最直接的方式,让__init__接受url参数并设置默认值,这样既保留原有的默认行为,又支持自定义传入:
class MyFunObject(object): def __init__(self, url="http://myurl.com"): self.url = url
现在你可以两种方式实例化:
- 使用默认url:
server = MyFunObject() - 自定义url:
server = MyFunObject(url="http://www.google.com")
方法2:实例化后直接修改属性
如果没办法修改原类的__init__方法(比如类来自第三方库),可以先实例化对象,再直接覆盖url属性:
server = MyFunObject() server.url = "http://www.google.com"
这种方式简单直接,适合快速修改单个属性的场景。
方法3:使用**kwargs实现更灵活的参数处理
如果以后可能需要添加更多可自定义的属性,可以用关键字参数包来处理,扩展性更强:
class MyFunObject(object): def __init__(self, **kwargs): # 优先使用传入的url,没有则用默认值 self.url = kwargs.get('url', "http://myurl.com") # 还可以添加其他属性的处理,比如: # self.name = kwargs.get('name', 'default_name')
这种方式允许你传入任意多个关键字参数,按需处理即可。
内容的提问来源于stack exchange,提问作者darksideofthesun
相关产品推荐
相关产品推荐

