Python 在不调用类的情况下创建对象
在matlab中,我可以通过执行以下操作创建结构数组(struct)Python 在不调用类的情况下创建对象,python,matlab,Python,Matlab,在matlab中,我可以通过执行以下操作创建结构数组(struct) person.name = 'Mike'; person.age = 25; person.gender = 'male'; 其中,在创建结构之前未定义person。当我试着用python来做这件事时,它给了我一个错误 name 'person' is not defined 在python中有类似的方法吗?谢谢 编辑:作为python的新手,我仍然认为使用matlab。我的问题是,我有一个函数,它将接受多个输入(超过40
person.name = 'Mike';
person.age = 25;
person.gender = 'male';
其中,在创建结构之前未定义person。当我试着用python来做这件事时,它给了我一个错误
name 'person' is not defined
在python中有类似的方法吗?谢谢
编辑:作为python的新手,我仍然认为使用matlab。我的问题是,我有一个函数,它将接受多个输入(超过40个),所以我没有函数(input1,input2,…,input40),我只需要函数(input),其中输入由input.1,input.2,…,input.40组成 您可能需要一个字典(哈希、关联数组):
在Python中,
person
必须是某个类的实例;它不能凭空实现
您可以实现与代码类似的功能,如下所示:
class Struct(object): pass
person = Struct()
person.name = 'Mike'
person.age = 25
person.gender = 'male'
print(person.__dict__)
这张照片是:
{'gender': 'male', 'age': 25, 'name': 'Mike'}
在Python中,您可以向对象动态添加成员,但是(1)名称必须已经存在(必须已分配),并且(2)必须绑定到某个类的实例。为此,您可以创建一个空类:
class Empty:
pass # empty statement otherwise the class declaration cannot succeed
构造它的实例并将其分配给变量
person = Empty()
然后添加您想要的任何数据
person.name = 'Mike'
person.age = 25
person.gender = 'male'
另一方面,如果您不需要“普通”类提供的附加功能,并且只想以key=>value的方式存储一些数据,那么您可能只需要使用字典
person={}
person['name']='Mike'
person['age']=25
person['gender']='male'
(请注意,至少在Python2.7之前,这主要只是风格/语法上的差异,因为实例成员是根据字典在下面实现的)
一般来说,当实例化以相同方式生成的多个对象时(通常在类构造函数中完成对成员的赋值;稍后添加成员通常会导致代码难以理解),需要类,否则需要字典 Python不会在你开始分配属性时神奇地创建一个容器对象,如果Matlab允许,我会认为Matlab被严重破坏。考虑这一点:
person.name = "Mike"
persom.age = 25
person.sex = "Male"
现在我们有两个对象,person
和persom
,并且person
没有age
,并且没有发生这种情况的迹象。稍后,您尝试打印person.age
,希望matlab会抱怨。。。实际错误后两页
类本身可以用作容器或命名空间。不需要实例化它,如果您只需要一组属性,它将为您节省一些输入
class sex:
male = "M"
female = "F"
class person:
name = "Mike"
age = 25
sex = sex.male
要访问或修改其中任何一个,您可以使用person.name
等
注意:我还使用了一个用于sex
的类来说明这样做的好处之一:它提供了数据值的一致性(不记得您使用的是“M”还是“Male”或“Male”),并捕捉到拼写错误(即Python会抱怨sex.mlae,但不会抱怨字符串“mlae”,如果您以后用“Male”检查它后者将失败)
当然,在这种类型的类定义中,您仍然存在拼写错误名称
、年龄
、或性别
的风险。因此,您可以将该类用作模板并实例化它
class Person:
def __init__(self, name, age=None, sex=None):
self.name, self.age, self.sex = name, age, sex
现在,当您这样做时:
person = Person("Mike", 25, sex.male)
或者,如果您想记录所有这些参数是什么:
person = Person("Mike", age=25, sex=sex.male)
几乎不可能得到一个属性名拼写错误的对象。如果你把事情搞砸了,Python会在你犯错的时候给你一条错误消息。这只是这样做的一个原因。虽然我推荐NPE或Matteo作为首选方法,但由于函数是python中的第一类对象,它们也可以用来模拟空类,但不能实例化为多个对象(因此每个函数只有一个对象实例)
>>def person():通过
...
>>>person.name='Mike'
>>>人名
“迈克”
>>>人
这很奇怪,所以我不建议使用它,但它确实说明了函数是python中的第一类对象。python 3.3添加了类
与对象不同,使用SimpleNamespace可以添加和删除属性。
如果使用关键字参数初始化SimpleNamespace对象,
这些将直接添加到基础命名空间中
SimpleNamespace可以用来替代类NS:pass。
但是,对于结构化记录类型,请改用namedtuple()
下面是一个关于如何使用它的示例:
from types import SimpleNamespace
person = SimpleNamespace(name='Mike', age=25, gender='male')
print(person)
输出:
名称空间(年龄=25,性别=男性,姓名=迈克)
输出:
名称空间(年龄=25,性别=男性,姓名=迈克)
Matlab的方法没有什么意义。为什么要在Python中执行类似的操作?在Python中按照Python语言规则做事有什么不对?为什么要在Python上强加不同语言的规则呢?嗨,s.洛特,请看下面我对kindall回应的评论。你真的想要一本Python词典。你最后的建议是最好的。最后一个问题是,你可以把顺序搞乱,例如:person=person(“Mike”,sex.male,25)谢谢。你的解释很清楚,很有用。我同意这是matlab中经常遇到的错误。请允许我描述一下我为什么问这个问题。作为python新手,我仍然使用matlab思考。我的问题是,我有一个函数,它将接受多个输入(超过40个),所以我没有函数(input1,input2,…,input40),我只需要函数(input),其中输入由input.1,input.2,…,input.40组成。我的以matlab为中心的解决方案在python中可能不可行,我可能不得不重新考虑该解决方案。感谢您可以尝试将每个输入添加到列表中,并通过列表的索引访问每个输入值。不过,顺序很重要,而且不像上面提到的那样灵活。@mikeP:你是说这个<代码>输入={};输入['input1']=值;输入['input2']=value。。。;功能(**输入)?如果这是Python中需要的,请实际提出一个
>>> def person():pass
...
>>> person.name = 'Mike'
>>> person.name
'Mike'
>>> person
<function person at 0x020CF2F0>
from types import SimpleNamespace
person = SimpleNamespace(name='Mike', age=25, gender='male')
print(person)
from types import SimpleNamespace
person = SimpleNamespace()
person.name = 'Mike'
person.age = 25
person.gender = 'male'
print(person)