如何在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'}
这不是使用描述符的正确方法这不是使用描述符的正确方法谢谢大家对一个描述符实例的介绍谢谢大家对一个描述符实例的介绍