2010-06-23 9 views
0

이것은 무엇보다 호기심에 관한 질문입니다. 나는 Python에 익숙하며 그 주위에서 놀고있다. 방금 base64 모듈을 살펴 봤습니다. 무엇을 대신 수행하는 경우 :파이썬에서 문자열에 능력을 추가하는 방법

>>> class b64string(): 
>>> <something> 
>>> 
>>> string = b64string('Foo Bar') 
>>> string 
'Foo Bar' 
>>> string.encode64() 
'Rm9vIEJhcg==' 
>>> string 
'Rm9vIEJhcg==' 
>>> string.assign('QmFyIEZvbw==') 
>>> string 
'QmFyIEZvbw==' 
>>> string.b64decode() 
'Bar Foo' 
>>> string 
'Bar Foo' 

클래스를 제작하는 간단한, 파이썬 방법이 있나요 :

import base64 
string = 'Foo Bar' 
encoded = base664.b64encode 

내가 그런 짓을하고 싶어?

>>> class b64string(base64): 
... def __init__(self, v): 
...  self.value=v 

를 그리고 이미 내가 얻을 :

은 이걸로 시작했습니다

Traceback (most recent call last): 
    File "<stdin>", line 1, in <module> 
TypeError: Error when calling the metaclass bases 
    module.__init__() takes at most 2 arguments (3 given) 

을 그리고 나 (단지 무슨 일이 일어날 지 참조하는)에 시작하지 않습니다 :

>>> class b64string(str, base64): pass 
... 
Traceback (most recent call last): 
    File "<stdin>", line 1, in <module> 
TypeError: Error when calling the metaclass bases 
    metaclass conflict: the metaclass of a derived class must be a (non-strict) subclass of the metaclasses of all its bases 

저는 새로운 클래스에 base64의 모든 속성을 나열하고 저장된 값을 argu로 호출하여 수동으로 수행하는 방법을 알고 있습니다. ment. 그러나 이것을하기위한 깔끔하고 공허한 방법이 있습니까? 그것을하는 것이 나쁜 생각입니까? 필요한 경우 많은 모듈을 사용하여 아이디어를 작성하고 필요한 모듈을 모두 가지고있는 "수퍼 문자열"을 가질 수 있습니다. 그게 나쁜가요? 그것은 비 - 파이썬이 아닌가? 그것이 파이썬이라면 어떻게됩니까?

+6

''Foo Bar'.encode ("base64")'에 문제가 있습니까? – YOU

+0

필자는 주요 질문에 대답하기 위해 파이썬의 방법으로는 아직 현명하지 못하지만 오류 메시지는 적어도 클래스가 아닌 모듈 인'base64'를 하위 클래스로 만들려고합니다. – shambulator

답변

1

복잡한 문자열 형 클래스를 만드는 것이 좋다고 생각하지 않지만 실제로 원한다면 예제를 실행하는 간단한 코드 조각을 사용하십시오.

먼저, 일반적인 문자열 래퍼 클래스를 정의합니다. 그 핵심은 모든 메서드 호출을 주어진 self.module으로 전달하고 self.string을 첫 번째 매개 변수로 추가하고 self.string에서 결과를 기억하는 __getattr__ 함수입니다.

import base64 

class ModuledString(object): 
    def __init__(self, string): 
     self.string = string 

    def __getattr__(self, attrname): 
     def func(*args, **kwargs): 
      result = getattr(self.module, attrname)(self.string, *args, **kwargs) 
      self.string = result 
      return result 
     return func 

    def __str__(self): 
     return str(self.string) 

쉽게 base64로 기능이있는 문자열 래퍼입니다 만들기 :

class B64String(ModuledString): 
    module = base64 

if __name__ == '__main__': 
    string = B64String('Foo Bar') 
    print string 
    # 'Foo Bar' 
    print string.b64encode() 
    # 'Rm9vIEJhcg==' 
    print string 
    # 'Rm9vIEJhcg==' 
    string.string = 'QmFyIEZvbw==' 
    print string 
    # 'QmFyIEZvbw==' 
    print string.b64decode() 
    # 'Bar Foo' 

참고 위의 예는 때문에 b64encodeb64decode는 첫 번째 인수로 문자열을과 같은 문자열을 반환 작동하는지 결과 (내 __getattr__ 함수에 유효성 검사가 없습니다). 무작위 모듈의 무작위 함수는 아마 어떤 종류의 예외를 발생시킬 것입니다. 결국, 주어진 모듈로부터 미리 정의 된 함수 집합으로 사용을 제한하는 것이 더 좋을지 모르지만, 그것은 이제는 쉬워야합니다.

반복 합니다만, 심각한 프로젝트에서는 이러한 코드를 사용하지 않는 것이 좋습니다.

+0

감사합니다. (그리고 늦은 응답에 대해 유감스럽게 생각합니다.) 이것은 실제 코드가 아니더라도 매우 유용합니다. 물론 파이썬이 어떻게 작동하는지 그리고 어떻게 사용되어야하는지 잘 이해해야합니다. 나는 일반적인 래퍼가 과도했을 것이라고 생각했을 것이다. 그리고 내가 다른 각도에서 고려해야 할 다른 많은 것들이있다. 이것은 내가 필요한 것입니다. 훌륭한! – eje211

관련 문제