Python 在不调用类的情况下创建对象

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

在matlab中,我可以通过执行以下操作创建结构数组(struct)

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)