You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

PHP转Python开发:$this->{var}转getattr及toArray方法改写求助

嘿,我来帮你搞定这个PHP转Python的小问题~

首先得指出你写的Python代码里几个容易踩的小坑,然后给你正确的写法:

先说说你现有代码的问题

  1. __init__参数没用到:你在__init__里接收了title、firstname等参数,但却把实例属性都设成了空字符串,这会导致初始化后所有属性都是空的,正确的做法应该把传入的参数赋值给self的属性。
  2. 方法语法错误:toArray方法缺少第一个必填的self参数(Python实例方法必须以self作为第一个参数);另外Python字典的键值对用:分隔,不是PHP的=>,且每个键值对之间需要加逗号。
  3. 类型对应错了:PHP里的关联数组对应Python的字典(dict),不是列表(list),你写的return []是列表,没法存键值对。

正确的转换写法

方式1:直接明确返回字典(最简洁,和PHP逻辑完全对应)

这种方式和你PHP里的写法最像,直接访问实例属性即可,完全不需要用到getattr(只有动态获取属性时才需要它):

class Person:
    # 注意:zip是Python内置函数,别用它当属性名,改成zip_code更安全
    def __init__(self, title, firstname, lastname, street, zip_code, city):
        self.title = title
        self.firstname = firstname
        self.lastname = lastname
        self.street = street
        self.zip_code = zip_code
        self.city = city

    # Python推荐蛇形命名法,to_array比toArray更符合PEP8规范
    def to_array(self):
        return {
            'title': self.title,
            'firstname': self.firstname,
            'lastname': self.lastname,
            'street': self.street,
            'zip': self.zip_code,  # 如果要保持和PHP一样的键名'zip',这里做个映射
            'city': self.city
        }

方式2:动态用getattr(适合属性很多的场景)

如果你的类有几十上百个属性,不想一个个写,可以用getattr批量生成字典:

class Person:
    def __init__(self, title, firstname, lastname, street, zip_code, city):
        self.title = title
        self.firstname = firstname
        self.lastname = lastname
        self.street = street
        self.zip_code = zip_code
        self.city = city

    def to_array(self):
        # 定义需要导出的属性列表
        field_mapping = [
            ('title', 'title'),
            ('firstname', 'firstname'),
            ('lastname', 'lastname'),
            ('street', 'street'),
            ('zip_code', 'zip'),  # 左边是实例属性名,右边是要返回的键名
            ('city', 'city')
        ]
        return {
            output_key: getattr(self, attr_name)
            for attr_name, output_key in field_mapping
        }

额外小提示

  • Python有严格的命名规范:类名用大驼峰(比如Person),函数/方法/属性名用蛇形(比如to_array、zip_code),尽量遵循规范让代码更易读。
  • 别用zip当变量名,它是Python内置的用来打包迭代器的函数,覆盖它可能会导致奇怪的bug。

内容的提问来源于stack exchange,提问作者akselj2

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.06 12:29:06