Python对只读属性的攻击

Python对只读属性的攻击,python,Python,我正在使用一些具有只读属性的第三方代码。 很明显,不管怎样,我都想改变它们 我尝试使用del但我一直得到:AttributeError:无法删除属性 这是我的密码: for page in suggested_pages: url = page.url + '?source=smart_404' full_url = page.full_url + '?source=smart_404' del page.url del page.full_url p

我正在使用一些具有只读属性的第三方代码。 很明显,不管怎样,我都想改变它们

我尝试使用
del
但我一直得到:
AttributeError:无法删除属性

这是我的密码:

for page in suggested_pages:
    url = page.url + '?source=smart_404'
    full_url = page.full_url + '?source=smart_404'

    del page.url
    del page.full_url

    page.url = url
    page.full_url = full_url
编辑人员一直在询问属性代码

@property
def full_url(self):
    """Return the full URL (including protocol / domain) to this page, or None if it is not routable"""
    url_parts = self.get_url_parts()

    if url_parts is None:
        # page is not routable
        return

    site_id, root_url, page_path = url_parts

    return root_url + page_path

@property
def url(self):
    """
    Return the 'most appropriate' URL for referring to this page from the pages we serve,
    within the Wagtail backend and actual website templates;
    this is the local URL (starting with '/') if we're only running a single site
    (i.e. we know that whatever the current page is being served from, this link will be on the
    same domain), and the full URL (with domain) if not.
    Return None if the page is not routable.
    """
    url_parts = self.get_url_parts()

    if url_parts is None:
        # page is not routable
        return

    site_id, root_url, page_path = url_parts

    if len(Site.get_site_root_paths()) == 1:
        # we're only running a single site, so a local URL is sufficient
        return page_path
    else:
        return root_url + page_path

代码来自Python中的

,只读属性通常通过
属性
函数实现

例如:

class A(object):
    def __init__(self, val):
        self._val = val
    @property
    def val(self):
        return self._val
这意味着只读属性不是对象的属性,而是类本身的特殊属性

希望您可以轻松地将setter添加到属性:

def setval(self, val):
    self._val = val
A.val = A.val.setter(setval)
a = A(5)
a.val
-> 5
a.val = 6
-> 6
或者也可以完全替换该属性。对于您的类,您可以这样做(我使用clazz作为您要更改的类的名称)

然后,您可以执行以下操作:

page.url = url
print(page.url)

主要的警告是,您必须修改所属类,而不仅仅是实例。

为什么要先删除它们?为什么不直接分配page.url呢?我得到了这个
属性错误:无法设置属性
您需要显示任何类
page
的代码。显然
url
没有设置器,为什么您要尝试覆盖该行为?page类有一个
self.url路径
,您可能可以更改它。改变它可能会破坏某些东西。仅仅因为你能改变事物并不意味着改变它们就能实现你的愿望。
page.url = url
print(page.url)