python은 Java Class.forName()과 동등합니까?
문자열 인수를 사용하여 Python에서 해당 문자열에 명명된 클래스의 개체를 만들어야 합니다.자바에서는Class.forName().newInstance()Python에 동등한 것이 있습니까?
답변 감사합니다.내가 무엇을 하고 있는지 알고 싶어하는 사람들에게 대답하려면:클래스 이름으로 명령줄 인수를 사용하여 인스턴스화합니다.저는 사실 Jython에서 프로그래밍을 하고 Java 클래스를 인스턴스화하고 있습니다. 그래서 질문의 Java-ness가 됩니다. getattr()잘 동작합니다.대단히 감사합니다.
python에서의 리플렉션은 Java에서의 리플렉션보다 훨씬 쉽고 유연합니다.
이 튜토리얼을 읽을 것을 권장합니다.
정규화된 클래스 이름을 가져와서 클래스를 반환하는 직접 함수는 없지만, 클래스 이름을 만드는 데 필요한 모든 부품을 가지고 있으므로 서로 연결할 수 있습니다.
조언 하나 하자면 파이썬을 입고 있을 때는 자바 스타일로 프로그램하려고 하지 마라.
당신이 하려는 것이 무엇인지 설명해 주시면, 아마도 우리가 좀 더 버마적인 방법을 찾아 드릴 수 있을 겁니다.
다음은 사용자가 원하는 기능을 수행하는 기능입니다.
def get_class( kls ):
parts = kls.split('.')
module = ".".join(parts[:-1])
m = __import__( module )
for comp in parts[1:]:
m = getattr(m, comp)
return m
이 함수의 반환 값은 클래스 자체인 것처럼 사용할 수 있습니다.
다음은 사용 예를 제시하겠습니다.
>>> D = get_class("datetime.datetime")
>>> D
<type 'datetime.datetime'>
>>> D.now()
datetime.datetime(2009, 1, 17, 2, 15, 58, 883000)
>>> a = D( 2010, 4, 22 )
>>> a
datetime.datetime(2010, 4, 22, 0, 0)
>>>
그것은 어떻게 작동합니까?
사용하고 있습니다.__import__클래스를 유지하는 모듈을 Import하기 위해서는 먼저 풀 수식 이름에서 모듈 이름을 추출해야 합니다.다음으로 모듈을 Import합니다.
m = __import__( module )
이 경우,m최상위 모듈만 참조합니다.
예를 들어, 당신의 클래스가 다음 주에 살고 있는 경우foo.baz모듈, 그 때m모듈이 될 것이다.foo
우리는 쉽게 참조할 수 있다.foo.baz사용.getattr( m, 'baz' )
최상위 모듈에서 클래스로 이동하려면 를 재귀적으로 사용해야 합니다.gettatr학급명 부분에
예를 들어 클래스 이름이foo.baz.bar.Model그럼 이렇게 하겠습니다.
m = __import__( "foo.baz.bar" ) #m is package foo
m = getattr( m, "baz" ) #m is package baz
m = getattr( m, "bar" ) #m is module bar
m = getattr( m, "Model" ) #m is class Model
이 루프에서는 다음과 같은 현상이 발생합니다.
for comp in parts[1:]:
m = getattr(m, comp)
루프의 끝에서m수업의 참고가 됩니다.즉,m는 실제로 클래스 itslef 입니다.다음은 예를 제시하겠습니다.
a = m() #instantiate a new instance of the class
b = m( arg1, arg2 ) # pass arguments to the constructor
클래스가 범위 내에 있다고 가정하면:
globals()['classname'](args, to, constructor)
그렇지 않은 경우:
getattr(someModule, 'classname')(args, to, constructor)
편집: getattr에는 'foo.bar'과 같은 이름을 지정할 수 없습니다..로 분할하여 왼쪽에서 오른쪽으로 각각 getattr()를 호출해야 합니다.이것은 다음을 처리할 수 있습니다.
module, rest = 'foo.bar.baz'.split('.', 1)
fooBar = reduce(lambda a, b: getattr(a, b), rest.split('.'), globals()[module])
someVar = fooBar(args, to, constructor)
def import_class_from_string(path):
from importlib import import_module
module_path, _, class_name = path.rpartition('.')
mod = import_module(module_path)
klass = getattr(mod, class_name)
return klass
사용.
In [59]: raise import_class_from_string('google.appengine.runtime.apiproxy_errors.DeadlineExceededError')()
---------------------------------------------------------------------------
DeadlineExceededError Traceback (most recent call last)
<ipython-input-59-b4e59d809b2f> in <module>()
----> 1 raise import_class_from_string('google.appengine.runtime.apiproxy_errors.DeadlineExceededError')()
DeadlineExceededError:
또 다른 구현입니다.
def import_class(class_string):
"""Returns class object specified by a string.
Args:
class_string: The string representing a class.
Raises:
ValueError if module part of the class is not specified.
"""
module_name, _, class_name = class_string.rpartition('.')
if module_name == '':
raise ValueError('Class name must contain module part.')
return getattr(
__import__(module_name, globals(), locals(), [class_name], -1),
class_name)
처음부터가 아니라 중간에서 접근하는 것 같아요.정말 뭘 하려고 하는 거야?특정 문자열과 연관된 클래스를 찾는 것은 목적을 위한 수단입니다.
독자 분의 정신적 리팩터링이 필요할 수 있는 문제를 명확히 한다면, 더 나은 해결책이 나타날 수 있습니다.
예:유형 이름과 매개 변수 집합을 기준으로 저장된 개체를 로드하시겠습니까?Python은 이 언픽을 주문하고 당신은 피클 모듈을 봐야 합니다.또한 언프링 프로세스는 설명대로 수행되지만 내부적으로 어떻게 작동하는지 걱정할 필요는 없습니다.
>>> class A(object):
... def __init__(self, v):
... self.v = v
... def __reduce__(self):
... return (self.__class__, (self.v,))
>>> a = A("example")
>>> import pickle
>>> b = pickle.loads(pickle.dumps(a))
>>> a.v, b.v
('example', 'example')
>>> a is b
False
이것은 python 표준 라이브러리에서 unittest로 볼 수 있습니다.TestLoader.loadTestsFromName.아쉽게도 이 메서드는 테스트와 관련된 추가 작업을 계속 수행하지만 이 첫 번째 ha는 재사용할 수 있을 것으로 보입니다.테스트 관련 기능을 삭제하도록 편집했습니다.
def get_object(name):
"""Retrieve a python object, given its dotted.name."""
parts = name.split('.')
parts_copy = parts[:]
while parts_copy:
try:
module = __import__('.'.join(parts_copy))
break
except ImportError:
del parts_copy[-1]
if not parts_copy: raise
parts = parts[1:]
obj = module
for part in parts:
parent, obj = obj, getattr(obj, part)
return obj
에 있는 모든 기존 클래스의 개체를 가져와야 했습니다.my_package 가져옵니다.my_package의 »__init__.py.
디렉토리 구조는 다음과 같습니다.
/my_package
- __init__.py
- module1.py
- module2.py
- module3.py
나의 ★★★★★★★★★★★★★★★★★.__init__.py음음음같 뭇매하다
from .module1 import ClassA
from .module2 import ClassB
그런 다음 다음과 같은 함수를 만듭니다.
def get_classes_from_module_name(module_name):
return [_cls() for _, _cls in inspect.getmembers(__import__(module_name), inspect.isclass)]
서 ★★★★★module_name = 'my_package'
검사 문서: https://docs.python.org/3/library/inspect.html#inspect.getmembers
언급URL : https://stackoverflow.com/questions/452969/does-python-have-an-equivalent-to-java-class-forname
'source' 카테고리의 다른 글
| window.location을 클릭합니다.JavaScript의 href 및 window.open() 메서드 (0) | 2023.01.26 |
|---|---|
| jQuery는 JavaScript의 addEventListener 메서드에 상당합니다. (0) | 2023.01.16 |
| 변수를 동적으로 작성하려면 어떻게 해야 합니까? (0) | 2023.01.16 |
| PDO 준비 문에서 원시 SQL 쿼리 문자열을 가져오는 중 (0) | 2023.01.16 |
| mariadb 출력에 대시가 너무 많습니다. (0) | 2023.01.16 |