클래스 가시성 문의

93 views
Skip to first unread message

GomSun2

unread,
Oct 8, 2011, 3:55:04 AM10/8/11
to pyt...@googlegroups.com
안녕하세요 우상정님.

집필해주신 파이썬 3을 보는 중 문의가 있어 게시글을 남김니다.

타 언어들은 private, protected, public과 같이 가시성(캡슐화)을 제한할 수 있는데요

파이썬에서의 방법이 궁금합니다.

일단 private 메소드는 __DoSomething(): 과 같이 작성하면 가시성에 제한을 받는 다는 것을 알았습니다.

문의 사항.
1. private, protected, 메소드 구성이 가능한가요 ?
2. protected 메소드를 자식세에서 접근하거나 재정의 하려면 어떻게 할 수 있나요 ?

감사합니다.

again4you

unread,
Oct 10, 2011, 9:31:20 AM10/10/11
to Python 3 질문 게시판
안녕하세요 우상정입니다.

우선 답변이 늦어서 죄송합니다.
게시판 뿐만 아니라 twitter까지 보내주셨는데,
주말동안 제가 서울과 대전을 오가며 조금 정신없이 지내다가
이제서야 답변드리게 되었습니다.

그럼 질문하신 내용에 대해서 하나씩 답변드리겠습니다.

1. private, protected, 메소드 구성이 가능한가요 ?

파이썬 언어에서 강제적으로 private, protected의 속성을 지정할 수 있는지 문의하신 것이라면,
그러한 방법은 없습니다.

앞서 책에서 설명드린 것처럼
파이썬에서는 언어에서 문법의 제약으로 정보 은닉 기능을 제공하기 보다는,
이름 변경으로 개발자의 의도를 나타내도록 하고 있습니다.

그렇기 때문에 Java, C++와 같은 형태로 접근 권한을 지정할 수 없습니다.

하지만 attribute를 이용하여 다른 언어가 가지고 있는 유사한 방법을 흉내낼 수는 있습니다.
이런 경우 개발자가 개발해야하는 코드의 양이 조금 늘어나기는 하지만,
Java가 가지는 정보 은닉 기능 이상의 것을 개발자가 디자인할 수 있습니다.

아래의 코드는 Protected 클래스를 정의하여
이를 상속받는 모든 클래스는 명시적으로 '@public'을 사용하지 않으면
private으로 만드는 예제입니다.

또한 이 코드에서는 C++, Java와는 다르게 parent에서는 private 속성을 지니고 있더라도,
child에서 public 속성을 부여할 수 있습니다.

자세한 내용은 아래의 코드 참조를 부탁드립니다.

그럼 오늘 하루도 즐거운 하루보내세요.
감사합니다.

def public(f):
f.__public__= True
return f

class Protected(object):
def __new__(cls, *args, **kwd):
obj = object.__new__(cls)
cls.__init__(obj, *args, **kwd)

def __getattr__(self, name):
attr = getattr(obj, name)
if hasattr(attr, "__public__"):
return attr
elif hasattr(cls, "__public__"):
if name in cls.__public__:
return attr
raise AttributeError("Attribute {0} is not
public".format(name))
def __setattr__(self, name, value):
attr = getattr(obj, name)
cls.__setattr__(self, name, value)
def is_own_magic(cls, name, without=[]):
return name not in without and
name.startswith("__") and name.endswith("__")

Proxy = type("Protected(%s)" % cls.__name__, (), {})
for name in dir(cls):
if is_own_magic(cls, name,
without=dir(Proxy)):
try:
setattr(Proxy, name,
getattr(obj, name))
except TypeError:
pass
Proxy.__getattr__ = __getattr__
Proxy.__setattr__ = __setattr__
return Proxy()


class Foo(Protected):
@public
def public_func(self):
print("public function")
return

def hidden_func(self):
print("Hidden function")
return

class Bar(Foo):
@public
def hidden_func(self):
print("Hidden function at parent class, but child is
public")
return


if __name__ == "__main__":
f = Foo()
f.public_func()
#f.hidden_func() - Exception 발생

b = Bar()
b.public_func()
b.hidden_func()

Reply all
Reply to author
Forward
0 new messages