有没有办法从另一个函数访问在一个函数中创建的类的属性?

2024-06-03 11:51:47 发布

您现在位置:Python中文网/ 问答频道 /正文

有没有办法从另一个函数访问在一个函数中创建的类的属性?你知道吗

class Component(object):
    Name = ''
    Num = 100

    def __setattr__(self, name, value):
        object.__setattr__(self, name, value)

def one():
    exec('AAA' + '=Component()')
    AAA.Name = 'AAA'
    AAA.Num = AAA.Num * 2
    print '1', AAA.Name, AAA.Num

def two():
    print '2', AAA.Name, AAA.Num

one()
two()

我得到一个“NameError:全局名称'AAA'未定义”


Tags: 函数nameselfobjectvaluedefonenum
3条回答

一种可能的解决方案:

创建一个全局列表(tuple、dict或任何合适的数据结构),并将实例添加到函数1的列表中,然后从函数2中的列表中获取实例。你知道吗

但是,不建议使用全局变量。你知道吗

类级属性属于该类,因此在该类的所有实例之间共享。你知道吗

如果您希望类的不同实例具有不同的namenum属性(顺便说一句,您应该为实例使用小写的属性名称),那么应该将它们添加为实例属性。您可以使用类名访问类属性(例如Component.NUM)。你知道吗

class Component(object):
    NAME = ''
    NUM = 100

    def __init__(self, name, num):
        self.name = name
        self.num = num

print Component.NAME  # ''
print Component.NUM  # 100

c = Component('AAA', Component.NUM * 2)
print c.name  # 'AAA'
print c.num  # 200

function之外实例化class,并在函数中使用该类实例。代码如下:

>>> class Component(object):
...     Name = ''
...     Num = 100
...     def __setattr__(self, name, value):
...         object.__setattr__(self, name, value)
...
>>> # Moved object creation to outside of func
... exec('AAA' + '=Component()')
>>>
>>> def one():
...     AAA.Name = 'AAA'
...     AAA.Num = AAA.Num * 2
...     print '1', AAA.Name, AAA.Num
...
>>> def two():
...     print '2', AAA.Name, AAA.Num
...     AAA.Name = 'BBB'
...     AAA.Num = AAA.Num * 2
...     print '3', AAA.Name, AAA.Num
...
>>> one()
1 AAA 200
>>> two()
2 AAA 200
3 BBB 400

相关问题 更多 >