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



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

person.name = 'Mike';
person.age = 25;
person.gender = 'male';

其中在创建结构之前未定义人。当我尝试用python执行此操作时,它给了我一个错误

name 'person' is not defined

在python中是否有类似的方法?谢谢

编辑:作为python的新手,我仍然认为matlab。我遇到的问题是我有一个函数,它将接受多个输入(超过 40(,所以我没有函数(input1,input2,...,input40(,我将只有函数(input(,其中输入由input.1,input.2,..,input.40组成。

在 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'

(请注意,至少在 Python 2.7 之前,这主要只是风格/语法的差异,因为实例成员是在字典方面

实现的(

作为一般准则,当您实例化以相同方式创建的多个对象时(并且通常对成员的赋值是在类构造函数中完成的;稍后添加成员通常难以遵循代码(,否则需要字典。

当你

开始为容器对象分配属性时,Python 不会神奇地创建一个容器对象,如果 matlab 允许这样做,我会认为 matlab 严重损坏。 考虑一下:

person.name = "Mike"
persom.age  = 25
person.sex  = "Male"

现在我们有两个对象,personpersomperson没有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会抱怨.mlae,但不会抱怨字符串"mlae",如果你稍后根据"male"检查它,后者会失败(。

当然,在这种类型的类定义中,你仍然有拼写错误nameagesex的风险。因此,您可以做的是将该类用作模板并实例化它。

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会在你犯错的时候给你一个错误消息。这只是这样做的一个原因。

Python 3.3 添加了 SimpleNamespace 类

与对象不同,使用 SimpleNamespace,您可以添加和删除属性。如果使用关键字参数初始化 SimpleNamespace 对象,这些将直接添加到基础命名空间中。

SimpleNamespace 可以替代类 NS: pass。但是,对于结构化记录类型,请改用 namedtuple((。

下面是如何使用它的示例:

from types import SimpleNamespace
person = SimpleNamespace(name='Mike', age=25, gender='male')
print(person)

输出:

命名空间(年龄=25,性别='男性',名字='迈克'(

from types import SimpleNamespace
person = SimpleNamespace()
person.name = 'Mike'
person.age = 25
person.gender = 'male'
print(person)

输出:

命名空间(年龄=25,性别='男性',名字='迈克'(

在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'}

你可能想要一个字典(哈希,关联数组(:

person = {'name': 'Mike', 'age': 25}

虽然我推荐NPE或Matteo作为首选方法,但由于函数是python中的第一类对象,它们也可用于模拟空类,但它们不能实例化为多个对象(因此每个函数只有一个对象实例(。

>>> def person():pass
...
>>> person.name = 'Mike'
>>> person.name
'Mike'
>>> person
<function person at 0x020CF2F0>

这很奇怪,所以我不建议使用它,但它确实说明了函数是 python 中的一类对象。

最新更新