Python 中的面向对象没有意义
【CSDN 编者按】许多人都在抨击面向对象,虽然我不认为他有什么问题,但我觉得至少在 Python 中没必要。
没有必要使用面向对象
classApiClient:
def__init__(self, root_url: str, session_cls: sessionmaker):
self.root_url = root_url
self.session_cls = session_cls
defconstruct_url(self, entity: str) -> str:
returnf"{self.root_url}/v1/{entity}"
def get_items(self,entity: str) -> List[Item]:
resp = requests.get(self.construct_url(entity))
resp.raise_for_status()
return [Item(**n) for n in resp.json()["items"]]
defsave_items(self, entity: str) -> None:
with scoped_session(self.session_cls)as session:
session.add(self.get_items(entity))
classClientA(ApiClient):
defconstruct_url(self, entity: str) -> str:
returnf"{self.root_url}/{entity}"
classClientB(ApiClient):
defconstruct_url(self, entity: str) -> str:
returnf"{self.root_url}/a/special/place/{entity}"
client_a = ClientA("https://client-a",session_cls)
client_a.save_items("bars")
@dataclass
classClient:
root_url: str
url_layout: str
client_a = Client(
root_url="https://client-a",
url_layout="{root_url}/{entity}",
)
client_b = Client(
root_url="https://client-b",
url_layout="{root_url}/a/special/place/{entity}",
)
defconstruct_url(client: Client, entity: str) -> str:
returnclient.url_layout.format(root_url=client.root_url, entity=entity)
defget_items(client: Client, entity: str) -> List[Item]:
resp = requests.get(construct_url(client, entity))
resp.raise_for_status()
return [Item(**n) for n in resp.json()["items"]]
defsave_items(client: Client, session_cls: session_cls, entity: str) -> None:
withscoped_session(session_cls) as session:
session.add(get_items(client, entity))
save_items(client_a,session_cls, "bars")
例外
你可能注意到,重构的代码中加入了@dataclass,它们只是记录类型。Python 5 可以直接支持这些,不需要使用“常规”类。 使用 Exception 的子类是没问题的。使用 try: ... except SomeClass: ...,基本上会形成一种层级,不过没关系,只要不要搞得过于复杂。 Enum,与上面一样,它们非常适合 Python。 在极罕见的情况下(至少在应用程序的开发中很少遇到),你可能会想出一种非常好用的类型然后到处使用,就像pandas.DataFrame/sqlalchemy.Session 一样。但是一般情况下,不要自欺欺人,不要骗自己说我们正在构建了不起的应用程序。谦虚使人进步。
面向对象的弊端
面向对象鼓励你修改数据。函数袋非常反对修改参数。不相信的话,你可以试试看,但可千万别生气。 面向对象只是返回的全局变量。你无法在函数之间共享数据,self 会强迫你使用更小的状态空间编写方便测试的函数。 混合数据和函数会加剧序列化的难度,而在当今 REST API 流行的情况下,序列化非常有用。 面向对象带来了疯狂的继承体系,关于这个话题的讨论到处都是。 最重要的是,面向对象没有任何附加价值,它只会导致你无法专心解决问题,并加剧浏览与理解代码的难度。
☞女朋友的一个建议,这位程序员创立仅 551 天公司就被 10 亿美元收购了
☞抽成 30% 的苹果税是良心价?谷歌也学“坏”了
☞“面向对象就是一个错误!”
☞回溯 Rust 2020:正在成为最受欢迎的编程语言
关注公众号:拾黑(shiheibook)了解更多
[广告]赞助链接:
四季很好,只要有你,文娱排行榜:https://www.yaopaiming.com/
让资讯触达的更精准有趣:https://www.0xu.cn/

随时掌握互联网精彩
赞助链接
排名
热点
搜索指数
- 1 增绿就是增优势 植树就是植未来 7967503
- 2 网购500元假茅台官方扫码为真 7993627
- 3 顾茜茜抖音账号被永久封禁 7849381
- 4 《政府工作报告》全文公布 7777615
- 5 多名外卖小哥提醒避雷黄焖鸡 7618112
- 6 夫妻连生9女 取名从招娣盼娣到仇娣 7552224
- 7 春捂要捂到什么时候?医生建议来了 7470027
- 8 老干部局招聘要求50岁 工资3000元 7360207
- 9 金秀贤把入伍期间照片私发给金赛纶 7239414
- 10 中小企业经营向暖 7127847