Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/280.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
获取对象';python中的父命名空间?_Python_Python Datamodel - Fatal编程技术网

获取对象';python中的父命名空间?

获取对象';python中的父命名空间?,python,python-datamodel,Python,Python Datamodel,在python中,可以使用“.”来访问对象的字典项。例如: class test( object ) : def __init__( self ) : self.b = 1 def foo( self ) : pass obj = test() a = obj.foo 从上面的示例中,如果有“a”对象,是否可以从中获取对“obj”的引用,该对象是分配给“foo”方法的父命名空间?例如,将obj.b更改为2?Python2.6+(包括Python3) 可以使用访问该方法绑

在python中,可以使用“.”来访问对象的字典项。例如:

class test( object ) :
  def __init__( self ) :
    self.b = 1
  def foo( self ) :
    pass
obj = test()
a = obj.foo
从上面的示例中,如果有“a”对象,是否可以从中获取对“obj”的引用,该对象是分配给“foo”方法的父命名空间?例如,将obj.b更改为2?

Python2.6+(包括Python3) 可以使用访问该方法绑定到的实例

>> a.__self__
<__main__.test object at 0x782d0>
>> a.__self__.b = 2
>> obj.b
2

在绑定方法上,可以使用三个特殊的只读参数:

  • 返回(未绑定)函数对象的im_func
  • im_self返回函数绑定到的对象(类实例)
  • im\u类返回im\u self类
围绕以下方面进行测试:

class Test(object):
    def foo(self):
        pass

instance = Test()
instance.foo          # <bound method Test.foo of <__main__.Test object at 0x1>>
instance.foo.im_func  # <function foo at 0x2>
instance.foo.im_self  # <__main__.Test object at 0x1>
instance.foo.im_class # <__main__.Test class at 0x3>

# A few remarks
instance.foo.im_self.__class__ == instance.foo.im_class # True
instance.foo.__name__ == instance.foo.im_func.__name__  # True
instance.foo.__doc__ == instance.foo.im_func.__doc__    # True

# Now, note this:
Test.foo.im_func != Test.foo # unbound method vs function
Test.foo.im_self is None

# Let's play with classmethods
class Extend(Test):
    @classmethod
    def bar(cls): 
        pass

extended = Extend()

# Be careful! Because it's a class method, the class is returned, not the instance
extended.bar.im_self # <__main__.Extend class at ...>

基本上,绑定方法的im_self属性会发生变化,允许在调用im_func

时使用它作为第一个参数,因为python2.6中的
im_self
im_func
的同义词分别是
\uu self
\uu func
<代码>im*属性在py3k中完全消失。因此,您需要将其更改为:

>> a.__self__
<__main__.test object at 0xb7b7d9ac>
>> a.__self__.b = 2
>> obj.b
2
>a.\uu self__
>>a.。\uuuu self\uuuuu.b=2
>>对象b
2.

哇,从没听说过我自己。非常感谢!使用dir()是发现类似dir(obj.foo)的东西的一个好方法,但我需要执行完全相反的操作:obj from a:)我的意思是在交互式提示下,出于学习目的。您可以查看不同类型的对象有哪些方法和属性;因此,如果您有一个实例方法,可以对其使用dir(),并查看是否有任何属性将您引导回对象。此外,dir(obj.foo)和dir(a)是一样的。我想迈尔斯很高兴你告诉他两个函数做相反的事情。不管怎样,我都觉得很有趣。
im\u class
的同义词是
\uuu self\uuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuu。
class Hint(object):
    def foo(self, *args, **kwargs):
        pass

    @classmethod
    def bar(cls, *args, **kwargs):
        pass

instance = Hint()

# this will work with both class methods and instance methods:
for name in ['foo', 'bar']:
    method = instance.__getattribute__(name)
    # call the method
    method.im_func(method.im_self, 1, 2, 3, fruit='banana')
>> a.__self__
<__main__.test object at 0xb7b7d9ac>
>> a.__self__.b = 2
>> obj.b
2