Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/backbone.js/2.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 - Fatal编程技术网

如何在python中访问派生属性类中的方法和属性

如何在python中访问派生属性类中的方法和属性,python,Python,我正在尝试将属性装饰器扩展到我自己的需要,但我不知道如何访问扩展属性中的属性和方法 class myproperty(property): def __init__(self, tooltip, cls_name, fget=None, fset=None, fdel=None, doc=None, **kwargs ): super().__init__(fget=fget, fset=fset, fdel=fdel, doc=doc)

我正在尝试将属性装饰器扩展到我自己的需要,但我不知道如何访问扩展属性中的属性和方法

class myproperty(property):
    def __init__(self, tooltip, cls_name,
             fget=None, fset=None, fdel=None, doc=None, **kwargs ):
        super().__init__(fget=fget, fset=fset, fdel=fdel, doc=doc)
        self._name = ''
        self._value = ''
        self._cls_name = None        # name of GUI object to be used

        self._datatype = None
        self._tooltip = tooltip
        self._cls_name = cls_name
        self._kwargs = dict(**kwargs)

    def __get__(self, *args, **kwargs):
        return self._datatype(self._value)

    def __set__(self, instance, value):
        self._value = value
        print(f'setting {value}')

    def __call__(self, f):
        self._value = f(self)
        self._datatype= type(self._value )
        self._name = f.__name__
        return self

    def get_membervalues(self):
        return {'name': self._name, 'cls_name': self._cls_name, 'tooltip': self._tooltip}
我可以使用该属性:

class myclass():
    @myproperty(tooltip='help', cls_name='AnotherClass')
    def data(self): return 4
而且它似乎在内部起作用

a = myclass()
print(a.data)        # prints out 4, __get__() is called
a.data = "10"        #  __set__ is called correctly
print(a.data)        #  prints out 10 correctly
print(type(a.data))  # prints out "int" which is correct
a.get_memvervalues()  # this does not work
如何访问方法“get\u memvervalues”或属性\u name、\u工具提示等? 我试过用inspect和cast,但还没有成功。 附加问题:当调用defcall(self,f)函数时,我会得到myclass中指向“data”的函数指针。如何从该函数指针中提取类的名称

如何访问方法“get\u memvervalues”或属性\u name、\u工具提示等

从一个类(
myclass
):

从类实例(
a
):

在这两种情况下,
data
是属性名称

例如:

a = myclass()
desc = type(a).__dict__['data']

print(desc.get_membervalues())    # {
                                  #     'name': 'data', 
                                  #     'cls_name': 'AnotherClass', 
                                  #     'tooltip': 'help'
                                  # }

print(desc._tooltip)              # help

print(vars(desc))                 # {
                                  #     '_name': 'data',
                                  #     '_value': 4,
                                  #     '_cls_name': 'AnotherClass', 
                                  #     '_datatype': <class 'int'>, 
                                  #     '_tooltip': 'help', 
                                  #     '_kwargs': {}
                                  # }
如果这对您有意义,那么您可以停止读取,并以非传统方式使用方法描述符

尽管有两个类实例,但只有一个描述符实例:

type(a).__dict__['data'] is type(b).__dict__['data']
(这应该很明显,因为
类型(a)是类型(b)

为了支持描述符“行为不同”,第一个参数(在
\uuuuu set\uuuuuu
中称之为
instance
,但它也传递给
\uuuu get\uuuuu
)是对类实例的引用——这就是传统方法中的
self
的内容

你通常想用这个

如何访问方法“get\u memvervalues”或属性\u name、\u工具提示等

从一个类(
myclass
):

从类实例(
a
):

在这两种情况下,
data
是属性名称

例如:

a = myclass()
desc = type(a).__dict__['data']

print(desc.get_membervalues())    # {
                                  #     'name': 'data', 
                                  #     'cls_name': 'AnotherClass', 
                                  #     'tooltip': 'help'
                                  # }

print(desc._tooltip)              # help

print(vars(desc))                 # {
                                  #     '_name': 'data',
                                  #     '_value': 4,
                                  #     '_cls_name': 'AnotherClass', 
                                  #     '_datatype': <class 'int'>, 
                                  #     '_tooltip': 'help', 
                                  #     '_kwargs': {}
                                  # }
如果这对您有意义,那么您可以停止读取,并以非传统方式使用方法描述符

尽管有两个类实例,但只有一个描述符实例:

type(a).__dict__['data'] is type(b).__dict__['data']
(这应该很明显,因为
类型(a)是类型(b)

为了支持描述符“行为不同”,第一个参数(在
\uuuuu set\uuuuuu
中称之为
instance
,但它也传递给
\uuuu get\uuuuu
)是对类实例的引用——这就是传统方法中的
self
的内容


您通常希望以某种方式使用它。

get\u membervalues
未在
myclass
中定义,因此
a
将无法访问它

它是在
myproperty
中定义的,因此下一个逻辑结论是尝试获取与
a.data
关联的
myproperty
对象。由于Python将函数存储在
myclass
myclass.\uuu dict\uuuu
中,因此我们可以找到如下属性对象:

a.__class__.__dict__['data']
然后从那里调用函数:

a.__class__.__dict__['data'].get_membervalues()
>>> {'name': 'data', 'cls_name': 'AnotherClass', 'tooltip': 'help'}

get\u membervalues
未在
myclass
中定义,因此
a
将无法访问它

它是在
myproperty
中定义的,因此下一个逻辑结论是尝试获取与
a.data
关联的
myproperty
对象。由于Python将函数存储在
myclass
myclass.\uuu dict\uuuu
中,因此我们可以找到如下属性对象:

a.__class__.__dict__['data']
然后从那里调用函数:

a.__class__.__dict__['data'].get_membervalues()
>>> {'name': 'data', 'cls_name': 'AnotherClass', 'tooltip': 'help'}

这不是使用描述符的正确方法这不是使用描述符的正确方法谢谢大家对一个描述符实例的介绍谢谢大家对一个描述符实例的介绍