简体   繁体   中英

Python strange namespace bahavior for class factory

I tried to write simple class factory using the "type" method. I called myclass_factory twice and It returned identical namespaces ( case1 and case2 ). But the values of myclass attribute in that namespaces were different (!) . Actualy it just what I need but I can not undestnad why I got that result. For my udestanding, since case1 and case2 are not objects but just same namespace ( <class ' main .MyClass'> ) they should refer to the same memory and should be case1.myclass = case2.myclass

Please explain how It could be so?

>>> def myclass_factory(myclass):
...     return type('MyClass',(object,),{'myclass': myclass})
...
>>> class class1:
...     pass
...
>>> class class2:
...     pass
...
>>> case1 = myclass_factory(class1)
>>> case2 = myclass_factory(class2)
>>>
>>> case1
<class '__main__.MyClass'>
>>> case2
<class '__main__.MyClass'>
>>>
>>> case1.myclass
<class '__main__.class1'>
>>> case2.myclass
<class '__main__.class2'>
>>>
>>>

Actually case 1 and case 2 are objects since you instantiate them. They are type objects and thus ordinary python objects. So you create two different type objects.

also see this answer: Link to answer

Also see This description

This is essentially equivalent to the following "normal" code for defining classes:

def MyClass(object):
    myclass = class1

case1 = MyClass

def MyClass(object):
    myclass = class2

case2 = MyClass

print(case1.myclass)
print(case2.myclass)

Types/classes are first-class objects, and creating a new type with the same name has no effect on the previous class one with that name that was saved in the variable case1 .

The technical post webpages of this site follow the CC BY-SA 4.0 protocol. If you need to reprint, please indicate the site URL or the original address.Any question please contact:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM