从Java转Python新手:如何以Pythonic方式给类添加对象属性?
Python风格的类属性添加方案(Java转Python新手向)
嘿,从Java转Python的话,确实会碰到一些风格上的小差异,我来帮你把这个需求改得更符合Python习惯~
首先先说说你原来的代码:你先在__init__里把self.data初始成列表,之后再赋值成字典,虽然能跑,但有点小问题——属性类型前后不一致,后续维护的时候容易让人困惑。而且Python有更灵活、更安全的写法:
推荐写法1:初始化时支持传入data参数(避免可变默认参数陷阱)
Python里如果直接用可变对象(比如{})做函数默认参数,会踩坑——所有类实例会共享同一个字典!所以我们用None做默认值,再在内部处理,这样既灵活又安全:
class DummyData: # Python类定义不用加空括号(除非继承其他类),更简洁 def __init__(self, lat, long, data=None): self.lat = lat self.long = long # 如果没传data,就初始化空字典;传了就用传入的内容 self.data = data if data is not None else {}
这样用的时候就可以直接在创建实例时传入你的字典,不用事后赋值:
my_data = { "mess_11" : 0.002, "mess_22" : 2.222, "mess_33" : 3.23 } loc_1 = DummyData(12, 22, my_data)
如果确实需要事后给data赋值,直接loc_1.data = my_data也完全没问题,这个写法兼容两种场景。
进阶:加上类型提示(让代码更清晰)
如果用的是Python 3.5+,可以加类型提示,让代码可读性更强,和Java的类型声明有点像但更灵活:
from typing import Dict, Optional class DummyData: def __init__(self, lat: float, long: float, data: Optional[Dict[str, float]] = None): self.lat = lat self.long = long self.data = data if data is not None else {}
这样别人一看就知道lat/long是浮点数,data是可选的字符串键+浮点数值的字典,维护起来更省心。
小细节:Python类的写法简化
你原来写的class DummyData():,在Python里如果没有继承其他类,括号可以省略,写成class DummyData:就好,这是更常规的写法。
内容的提问来源于stack exchange,提问作者TheProfiler
相关产品推荐
相关产品推荐

