PHP转Python开发:$this->{var}转getattr及toArray方法改写求助
嘿,我来帮你搞定这个PHP转Python的小问题~
首先得指出你写的Python代码里几个容易踩的小坑,然后给你正确的写法:
先说说你现有代码的问题
__init__参数没用到:你在__init__里接收了title、firstname等参数,但却把实例属性都设成了空字符串,这会导致初始化后所有属性都是空的,正确的做法应该把传入的参数赋值给self的属性。- 方法语法错误:
toArray方法缺少第一个必填的self参数(Python实例方法必须以self作为第一个参数);另外Python字典的键值对用:分隔,不是PHP的=>,且每个键值对之间需要加逗号。 - 类型对应错了: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
相关产品推荐
相关产品推荐

