我用python制作了一个指针类,只要将这个类作为第一个类继承,类型类作为第二个类继承,就可以实现有语法提示的指针,但现在有一个问题,我在实例化的时候用type函数重新生成了一个类,导致这个类的实例类型不等于这个类,我要怎么办?
Pointer
def fun_(_fun_):
def fun__(self_, *args_, **kwargs_):
return _fun_(self_.__value__, *args_, **kwargs_)
return fun__
class Pointer:
__TypePointer = {}
__dir = ['__class__', '__new__', '__init__', '__getattribute__', '__setattr__']
def __new__(cls, *args, **kwargs):
bases = cls.__bases__
if bases[0] != Pointer:
raise TypeError('Pointer需要作为第一个被继承的父类')
if len(bases) == 1:
return super().__new__(cls)
elif len(bases) == 2:
class_ = cls.__bases__[1]
else:
raise TypeError('只能设置一个类型作为指针类型')
if cls.__name__ not in cls.__TypePointer:
p = type(cls.__name__, (Pointer,), {'__type__': class_, '__value__': class_()})
for name in dir(class_):
if name in cls.__dir:
continue
if name[:2] == name[-2:] == '__':
fun = getattr(class_, name)
if callable(fun):
setattr(p, name, fun_(fun))
cls.__TypePointer[cls.__name__] = p
else:
p = cls.__TypePointer[cls.__name__]
p = p(*args, **kwargs)
return p
def __init__(self, value=None):
self.__value__ = value
def __getattribute__(self, item):
if item == '__value__':
return super().__getattribute__('__value__')
if item == '__type__':
return super().__getattribute__('__type__')
return getattr(super().__getattribute__('__value__'), item)
def __setattr__(self, item, value):
if item == '__value__':
if type(value) == self.__type__:
super().__setattr__('__value__', value)
else:
raise ValueError('类型不匹配')
else:
setattr(super().__getattribute__('__value__'), item, value)
class StrPointer(Pointer, str):
pass
test.py
from Pointer import StrPointer
s = StrPointer('a')
print(type(s), StrPointer)
print(type(s) == StrPointer)
输出
<class 'Pointer.StrPointer'> <class 'Pointer.StrPointer'>
False
我知道为什么,但我没法解决。我不希望将__new__函数中的内容移到外面来,因为这样会增加创建有类型指针类的难度,原本只需要多重继承一下即可。
new应该作为元类使用
本文向大家介绍怎么确保一个集合不能被修改?相关面试题,主要包含被问及怎么确保一个集合不能被修改?时的应答技巧和注意事项,需要的朋友参考一下 可以使用 Collections. unmodifiableCollection(Collection c) 方法来创建一个只读集合,这样改变集合的任何操作都会抛出 Java. lang. UnsupportedOperationException 异常。 示
pandas只会创造新表吗?不能直接修改旧表?
1.手机版 设置方法:我-设置-修改密码 2.电脑版 设置方法:设置-帐号-修改密码
本文向大家介绍React为什么不要直接修改state?如果想修改怎么做?相关面试题,主要包含被问及React为什么不要直接修改state?如果想修改怎么做?时的应答技巧和注意事项,需要的朋友参考一下 不能直接修改state,组件修改state,并不会重新触发render. state的更新是异步的,调用setState时,组件state并不会立即改变,只是把要修改的状态放入事件队列当中. this
1.手机版 1)从个人资料中修改:我-头像栏-点击手机号 2)从设置中修改:我-设置-修改手机号 2.电脑版 1)从个人资料修改:头像栏-手机号-修改 2)从设置修改:设置-帐号-修改手机号
我正在开发一个基于PyQT的Windows应用程序。我有很多文件夹与许多python文件。但是当我尝试用pyInster python包创建一个可执行文件时,其他文件夹中文件的依赖关系无法解决。对于Simplicity,这是我的文件夹结构 我使用了pyinstaller main命令。py--onefile问题在于gui。py导入实用程序。生成exe后无法解析的folderstructure。 e