2016-06-21 3 views
-1

일부 읽기 전용 속성을 가진 제 3 자 코드를 사용하고 있습니다. 분명히 관계없이 변경하고 싶습니다.파이썬 해킹 읽기 전용 속성

나는 del를 사용하여 시도하지만 점점 계속 : 여기

AttributeError: can't delete attribute 내 코드입니다 :

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 

코드는 Wagtail CMS

에서 왔습니다.210
+2

왜 처음에 델을 해보려고합니까? 왜 page.url을 직접 할당하지 않습니까? –

+0

이 'AttributeError : 속성을 설정할 수 없습니다'라는 메시지가 나타납니다. – Lee

+2

'page' 클래스의 코드를 표시해야합니다. –

답변

0

파이썬에서 읽기 전용 속성은 일반적으로 property 함수를 통해 구현됩니다.

예 :

읽기 전용 속성은 개체의 특성,하지만 클래스 자체의 특별한 속성이 없음을 의미
class A(object): 
    def __init__(self, val): 
     self._val = val 
    @property 
    def val(self): 
     return self._val 

.

def setval(self, val): 
    self._val = val 
A.val = A.val.setter(setval) 
a = A(5) 
a.val 
-> 5 
a.val = 6 
-> 6 

을 또는 당신은 또한 완전히 속성을 대체 할 수

바라건대, 당신은 쉽게 속성에 세터를 추가 할 수 있습니다.

page.url = url 
print(page.url) 

주요주의해야 할 점은 수정해야한다는 것입니다 : 수업 들어, 당신은 할 수

clazz.orig_url = url 
def set_url(self, url): 
    self._url = url 
clazz.url = property((lambda self: self._url), seturl) 

(난 당신이 변경하려는 클래스의 이름을 clazz에 사용) 할 수 인스턴스 소유뿐만 아니라 소유 클래스.