python에서 개인 모듈 함수 정의
http://www.faqs.org/docs/diveintopython/fileinfo_private.html에 따르면:
대부분의 언어와 마찬가지로 Python은 프라이빗 요소의 개념을 가지고 있습니다.
- 모듈 외부에서 호출할 수 없는 개인 함수
다만, 다음의 2개의 파일을 정의하는 경우는,
#a.py
__num=1
또, 다음과 같이 합니다.
#b.py
import a
print a.__num
가 뛰었을 때b.py
1
어떤 예외도 없이.diveintophython이 잘못된 건가요, 아니면 제가 뭔가 잘못 알고 있는 건가요?또한 모듈의 기능을 비공개로 정의할 수 있는 방법이 있습니까?
Python에서는, 「프라이버시」는 「어른의 동의」수준에 의존합니다.- 강요할 수 없습니다.선두에 있는 밑줄 하나가 "외부"에서 액세스해서는 안 된다는 것을 의미합니다. 선두에 있는 밑줄 두 개(뒤에 있는 밑줄 포함)는 메시지를 더 강력하게 전달합니다.하지만 결국, 그것은 여전히 사회적 관습과 합의에 달려 있다.Python의 자기 성찰은 당신이 원하는 것을 존중하기 위해 세상의 모든 프로그래머에게 수갑을 채울 수 없을 정도로 강력하다.
비밀이지만한 ((단, 밀, 밀, C++)이 사용됩니다.★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★,#define private public
#include
your your .h
수
class private와 module private 사이에 혼동이 있을 수 있습니다.
프라이빗 모듈은 언더스코어 1개로 시작합니다.
.from <module_name> import *
명령어 . 단, 하면 .import <moudule_name>
구문(벤 빌헬름의 답변 참조)
a에서 언더스코어 1개를 삭제하기만 하면 됩니다.은 a이 모듈에서는 Import를 사용하여 되지 않습니다.from a import *
구문을 사용합니다.
클래스 이등병은 두 개의 밑줄(즉, double under-score)로 시작합니다.
이러한 변수의 이름은 클래스 이름 등을 포함하도록 "혼합"되어 있습니다.
클래스 로직 이외의 이름에서도 액세스 할 수 있습니다.
이름 망글링(Mangling)은 무단 액세스에 대한 가벼운 방지 장치 역할을 할 수 있지만, 주요 목적은 상위 클래스의 클래스 멤버와의 이름 충돌을 방지하는 것입니다.Alex Martelli가 이러한 변수와 관련하여 사용되는 관습을 설명할 때 동의하는 성인에 대한 재미있지만 정확한 언급을 참조하십시오.
>>> class Foo(object):
... __bar = 99
... def PrintBar(self):
... print(self.__bar)
...
>>> myFoo = Foo()
>>> myFoo.__bar #direct attempt no go
Traceback (most recent call last):
File "<stdin>", line 1, in <module>
AttributeError: 'Foo' object has no attribute '__bar'
>>> myFoo.PrintBar() # the class itself of course can access it
99
>>> dir(Foo) # yet can see it
['PrintBar', '_Foo__bar', '__class__', '__delattr__', '__dict__', '__doc__', '__
format__', '__getattribute__', '__hash__', '__init__', '__module__', '__new__',
'__reduce__', '__reduce_ex__', '__repr__', '__setattr__', '__sizeof__', '__str__
', '__subclasshook__', '__weakref__']
>>> myFoo._Foo__bar #and get to it by its mangled name ! (but I shouldn't!!!)
99
>>>
모듈 프라이버시는 완전히 일반적인 것이 아니기 때문에, 또 Import를 사용하면 사용 방법에 따라 모듈프라이버시가 인식될 수도 있고 인식되지 않을 수도 있기 때문에, 이 질문에는 완전히 답변되지 않았습니다.
모듈에서 개인 이름을 정의하면 해당 이름이 구문 'import module_name'을 사용하는 스크립트로 Import됩니다.따라서 a.py에서 private 모듈 _num을 올바르게 정의했다고 가정합니다.
#a.py
_num=1
b.py에서 모듈 이름 기호를 사용하여 액세스할 수 있습니다.
#b.py
import a
...
foo = a._num # 1
a.py 에서 비프라이빗만 Import 하려면 from 구문을 사용해야 합니다.
#b.py
from a import *
...
foo = _num # throws NameError: name '_num' is not defined
단, 모듈 이름을 모두 '*'로 Import하는 것보다 모듈에서 이름을 Import할 때는 명시적으로 하는 것이 좋습니다.
#b.py
from a import name1
from a import name2
...
Python은 이중 언더스코어 접두사를 가진 개인 클래스 멤버를 허용합니다.이 기술은 모듈 레벨에서는 동작하지 않기 때문에 Dive Into Python에서의 실수라고 생각합니다.
프라이빗 클래스 함수의 예를 다음에 나타냅니다.
class foo():
def bar(self): pass
def __bar(self): pass
f = foo()
f.bar() # this call succeeds
f.__bar() # this call fails
내부 함수를 추가할 수 있습니다.
def public(self, args):
def private(self.root, data):
if (self.root != None):
pass #do something with data
그런 수준의 사생활이 정말 필요한 경우죠.
이것은 오래된 질문이지만 모듈프라이빗 변수(1개의 밑줄)와 클래스프라이빗 변수(2개의 밑줄) 모두 표준 매뉴얼에 기재되어 있습니다.
Python 튜토리얼 classes클래스 private프라이빗 변수
폐쇄나 기능이 내장되어 있는 것도 하나의 방법입니다.이는 JS에서 일반적이지만 브라우저 이외의 플랫폼이나 브라우저 작업자에게는 필요하지 않습니다.
Python에서는 조금 이상한 것 같지만, 만약 뭔가 정말로 숨겨야 한다면, 그것이 방법일지도 모릅니다.python API를 사용하여 C(또는 다른 언어)에 숨겨야 하는 것을 유지하는 것이 가장 좋은 방법일 것입니다.함수 안에 코드를 넣고 호출하여 내보내고 싶은 아이템을 반환할 수 없습니다.
방법의 경우: (이것이 당신이 원하는 것인지 확실하지 않습니다.)
print_thrice.화이
def private(method):
def methodist(string):
if __name__ == "__main__":
method(string)
return methodist
@private
def private_print3(string):
print(string * 3)
private_print3("Hello ") # output: Hello Hello Hello
other_file.py
from print_thrice import private_print3
private_print3("Hello From Another File? ") # no output
아직 메서드를 "표시"하거나 "호출"할 수 있기 때문에 이는 완벽한 솔루션이 아닐 수 있습니다.그래도 실행이 안 돼요.
답변이 늦어진 경우 죄송합니다.모듈에서는 다음과 같이 패키지를 "내보내기"로 정의할 수 있습니다.
mymodule
__init__.py
library.py
main.py
mymodule/mymodule/mymodule.화이
# 'private' function
def _hello(name):
return f"Hello {name}!"
# 'public' function which is supposed to be used instead of _hello
def hello():
name = input('name: ')
print(_hello(name))
mymodule/_init_.py
# only imports certain functions from library
from .library import hello
main.py
import mymodule
mymodule.hello()
그럼에도 불구하고, 기능은 여전히 액세스할 수 있습니다.
from mymodule.library import _hello
print(_hello('world'))
하지만 이 접근법은 더 명확하지 않다.
PEP8 가이드라인을 참조해 주세요.
메서드 이름과 인스턴스 변수
필요에 따라 소문자 및 밑줄로 구분된 이름을 사용하여 읽기 쉽게 합니다.
공개되지 않은 메서드 및 인스턴스 변수에 대해서만 선행 언더스코어를 사용합니다.
하위 클래스와 이름 충돌을 방지하려면 앞에 있는 두 개의 밑줄을 사용하여 Python의 이름 망글링 규칙을 호출하십시오.
Python은 이러한 이름을 클래스 이름으로 망칩니다. 클래스 Foo에 __a라는 속성이 있으면 Foo에서 액세스할 수 없습니다.__a. (고집적인 사용자는 Foo를 호출하여 계속 액세스할 수 있습니다._Foo__a)일반적으로 이중 선행 밑줄은 하위 클래스로 설계된 클래스의 속성과의 이름 충돌을 방지하기 위해 사용해야 합니다.
상속을 위한 설계
클래스의 메서드 및 인스턴스 변수(전체적으로 "속성")를 공용으로 할지 또는 비공용으로 할지 항상 결정합니다.확실하지 않은 경우 non-public을 선택합니다.non-public 속성을 non-public으로 하는 것보다 나중에 공개하는 것이 더 쉽습니다.
퍼블릭 어트리뷰트는 클래스 내의 관련 없는 클라이언트가 이전 버전과 호환되지 않는 변경을 회피하기 위해 사용할 것으로 예상되는 어트리뷰트입니다.비공개 애트리뷰트는 서드파티에 의해 사용되지 않는 애트리뷰트입니다.비공개 애트리뷰트가 변경되거나 삭제되지 않는다는 보장은 없습니다.
Python에서는 (일반적으로 불필요한 작업량이 없는) 속성이 실제로 비공개로 되어 있지 않기 때문에 여기서는 "private"라는 용어를 사용하지 않습니다.
Python에는 private, public, protected의 3가지 모드가 있습니다.모듈을 Import하는 동안에는 퍼블릭모드만 액세스 할 수 있습니다.따라서 프라이빗모듈 및 보호모듈은 Import 시 모듈 외부에서 호출할 수 없습니다.
언급URL : https://stackoverflow.com/questions/1547145/defining-private-module-functions-in-python
'programing' 카테고리의 다른 글
경고: 숫자가 아닌 값이 발견되었습니다. (0) | 2022.09.18 |
---|---|
Java에서의 JSON 오브젝트 해석 (0) | 2022.09.18 |
Java 스위치 문의 여러 케이스 (0) | 2022.09.18 |
이 PHP 설치 Ubuntu Nginx에서는 GD 라이브러리 확장을 사용할 수 없습니다. (0) | 2022.09.18 |
루멘과 라라벨의 차이점과 유사점 (0) | 2022.09.18 |