답변:
많은 객체의 경우이 코드를 사용하여 'object'를 원하는 객체로 대체 할 수 있습니다.
object_methods = [method_name for method_name in dir(object)
if callable(getattr(object, method_name))]
diveintopython.net (지금 보관 됨) 에서 발견했습니다 . 바라건대, 더 자세한 내용을 제공해야합니다!
을 얻는 경우 AttributeError
대신 다음을 사용할 수 있습니다 .
getattr(
팬더 스타일 python3.6 추상 가상 하위 클래스에 대한 편견이 없습니다. 이 코드는 위와 동일하며 예외를 무시합니다.
import pandas as pd
df = pd.DataFrame([[10, 20, 30], [100, 200, 300]],
columns=['foo', 'bar', 'baz'])
def get_methods(object, spacing=20):
methodList = []
for method_name in dir(object):
try:
if callable(getattr(object, method_name)):
methodList.append(str(method_name))
except:
methodList.append(str(method_name))
processFunc = (lambda s: ' '.join(s.split())) or (lambda s: s)
for method in methodList:
try:
print(str(method.ljust(spacing)) + ' ' +
processFunc(str(getattr(object, method).__doc__)[0:90]))
except:
print(method.ljust(spacing) + ' ' + ' getattr() failed')
get_methods(df['foo'])
print [method for method in dir(object) if callable(getattr(object, method))]
.
AttributeError: module 'pandas.core.common' has no attribute 'AbstractMethodError'
실행하려고 할 때가 있습니다. stackoverflow.com/q/54713287/9677043 에서 자세한 내용을 참조하십시오 .
내장 dir()
함수를 사용하여 모듈의 모든 속성 목록을 가져올 수 있습니다. 명령 행에서이를 시도하여 작동 방식을 확인하십시오.
>>> import moduleName
>>> dir(moduleName)
또한 hasattr(module_name, "attr_name")
함수를 사용하여 모듈에 특정 속성이 있는지 확인할 수 있습니다 .
자세한 내용은 Python 내부 검사 안내서를 참조하십시오 .
hasattr
유스 케이스가 파이썬 객체에 특정 멤버 변수 또는 메소드가 있는지 찾는 데 도움이되었습니다.
가장 간단한 방법은를 사용하는 것 dir(objectname)
입니다. 해당 객체에 사용 가능한 모든 방법이 표시됩니다. 멋진 트릭.
AttributeError: module 'pandas.core.common' has no attribute 'AbstractMethodError'
. 어떤 아이디어? stackoverflow.com/q/54713287/9677043 에서 deets를 참조하십시오 . @Pawan Kumar b / c에 +1하고 답은 효과가 있으며 @ljs는 필터링 된 메소드 목록을 약속합니다.
나는 당신이 원하는 것이 다음과 같다고 믿습니다.
객체의 속성 목록
저의 겸손한 의견으로는 내장 함수 dir()
가이 작업을 수행 할 수 있습니다. help(dir)
Python Shell의 출력에서 가져온 것입니다 .
dir (...)
dir([object]) -> list of strings
인수없이 호출 된 경우 현재 범위의 이름을 반환하십시오.
그렇지 않으면, 주어진 객체의 속성과 그로부터 도달 할 수있는 속성을 포함하는 알파벳순으로 된 이름 목록을 반환합니다.
객체가라는 이름의 메소드를 제공하면
__dir__
사용됩니다. 그렇지 않으면 기본 dir () 논리가 사용되고 다음을 리턴합니다.
- 모듈 객체의 경우 : 모듈의 속성.
- 클래스 객체의 경우 속성과 재귀 적으로 기본 속성입니다.
- 다른 객체 : 속성, 클래스 속성 및 재귀 적으로 클래스 기본 클래스의 속성.
예를 들면 다음과 같습니다.
$ python
Python 2.7.6 (default, Jun 22 2015, 17:58:13)
[GCC 4.8.2] on linux2
Type "help", "copyright", "credits" or "license" for more information.
>>> a = "I am a string"
>>>
>>> type(a)
<class 'str'>
>>>
>>> dir(a)
['__add__', '__class__', '__contains__', '__delattr__', '__doc__',
'__eq__', '__format__', '__ge__', '__getattribute__', '__getitem__',
'__getnewargs__', '__getslice__', '__gt__', '__hash__', '__init__',
'__le__', '__len__', '__lt__', '__mod__', '__mul__', '__ne__', '__new__',
'__reduce__', '__reduce_ex__', '__repr__', '__rmod__', '__rmul__',
'__setattr__', '__sizeof__', '__str__', '__subclasshook__',
'_formatter_field_name_split', '_formatter_parser', 'capitalize',
'center', 'count', 'decode', 'encode', 'endswith', 'expandtabs', 'find',
'format', 'index', 'isalnum', 'isalpha', 'isdigit', 'islower', 'isspace',
'istitle', 'isupper', 'join', 'ljust', 'lower', 'lstrip', 'partition',
'replace', 'rfind', 'rindex', 'rjust', 'rpartition', 'rsplit', 'rstrip',
'split', 'splitlines', 'startswith', 'strip', 'swapcase', 'title',
'translate', 'upper', 'zfill']
문제를 확인하면서의 출력 형식을 개선하여 내 생각의 기차를 보여 주기로 결정했습니다 dir()
.
dir_attributes.py (Python 2.7.6)
#!/usr/bin/python
""" Demonstrates the usage of dir(), with better output. """
__author__ = "ivanleoncz"
obj = "I am a string."
count = 0
print "\nObject Data: %s" % obj
print "Object Type: %s\n" % type(obj)
for method in dir(obj):
# the comma at the end of the print, makes it printing
# in the same line, 4 times (count)
print "| {0: <20}".format(method),
count += 1
if count == 4:
count = 0
print
dir_attributes.py (Python 3.4.3)
#!/usr/bin/python3
""" Demonstrates the usage of dir(), with better output. """
__author__ = "ivanleoncz"
obj = "I am a string."
count = 0
print("\nObject Data: ", obj)
print("Object Type: ", type(obj),"\n")
for method in dir(obj):
# the end=" " at the end of the print statement,
# makes it printing in the same line, 4 times (count)
print("| {:20}".format(method), end=" ")
count += 1
if count == 4:
count = 0
print("")
내가 기여하기를 바랍니다 :).
더 직접적인 답변 외에도 iPython에 대해 언급하지 않았다면 나는 결심 할 것 입니다. 자동 완성 기능으로 사용 가능한 방법을 보려면 '탭'을 누르십시오.
그리고 일단 방법을 찾으면 다음을 시도하십시오.
help(object.method)
pydocs, 메소드 서명 등을 보려면
아아 ... 대체 .
특별히 메소드를 원한다면 inspect.ismethod 를 사용해야합니다 .
메소드 이름의 경우 :
import inspect
method_names = [attr for attr in dir(self) if inspect.ismethod(getattr(self, attr))]
방법 자체 :
import inspect
methods = [member for member in [getattr(self, attr) for attr in dir(self)] if inspect.ismethod(member)]
때때로 inspect.isroutine
"유지"컴파일러 지시어가없는 내장, C 확장, Cython의 경우 에도 유용 할 수 있습니다.
inspect.getmembers
에 사용 하는 대신 사용해서는 안 dir
됩니까?
bash 쉘을 엽니 다 (Ubuntu에서 Ctrl + Alt + T). python3 쉘을 시작하십시오. 방법을 관찰 할 객체를 만듭니다. 그 뒤에 점을 추가하고 "탭"을 두 번 누르면 다음과 같은 내용이 표시됩니다.
user@note:~$ python3
Python 3.4.3 (default, Nov 17 2016, 01:08:31)
[GCC 4.8.4] on linux
Type "help", "copyright", "credits" or "license" for more information.
>>> import readline
>>> readline.parse_and_bind("tab: complete")
>>> s = "Any object. Now it's a string"
>>> s. # here tab should be pressed twice
s.__add__( s.__rmod__( s.istitle(
s.__class__( s.__rmul__( s.isupper(
s.__contains__( s.__setattr__( s.join(
s.__delattr__( s.__sizeof__( s.ljust(
s.__dir__( s.__str__( s.lower(
s.__doc__ s.__subclasshook__( s.lstrip(
s.__eq__( s.capitalize( s.maketrans(
s.__format__( s.casefold( s.partition(
s.__ge__( s.center( s.replace(
s.__getattribute__( s.count( s.rfind(
s.__getitem__( s.encode( s.rindex(
s.__getnewargs__( s.endswith( s.rjust(
s.__gt__( s.expandtabs( s.rpartition(
s.__hash__( s.find( s.rsplit(
s.__init__( s.format( s.rstrip(
s.__iter__( s.format_map( s.split(
s.__le__( s.index( s.splitlines(
s.__len__( s.isalnum( s.startswith(
s.__lt__( s.isalpha( s.strip(
s.__mod__( s.isdecimal( s.swapcase(
s.__mul__( s.isdigit( s.title(
s.__ne__( s.isidentifier( s.translate(
s.__new__( s.islower( s.upper(
s.__reduce__( s.isnumeric( s.zfill(
s.__reduce_ex__( s.isprintable(
s.__repr__( s.isspace(
ipython
하고 객체 입력을 시작한 다음을 눌러도 tab
작동합니다. Readline 설정이 필요하지 않음
여기에 표시된 모든 방법의 문제점은 방법이 존재하지 않는다는 것을 확신 할 수 없다는 것입니다.
파이썬에서 당신은을 통해 호출 점을 차단할 수 있도록 __getattr__
하고 __getattribute__
가능 "런타임에"방법을 생성하고,
예 :
class MoreMethod(object):
def some_method(self, x):
return x
def __getattr__(self, *args):
return lambda x: x*2
그것을 실행하면 객체 사전에 존재하지 않는 메소드를 호출 할 수 있습니다 ...
>>> o = MoreMethod()
>>> o.some_method(5)
5
>>> dir(o)
['__class__', '__delattr__', '__dict__', '__doc__', '__format__', '__getattr__', '__getattribute__', '__hash__', '__init__', '__module__', '__new__', '__reduce__', '__reduce_ex__', '__repr__', '__setattr__', '__sizeof__', '__str__', '__subclasshook__', '__weakref__', 'some_method']
>>> o.i_dont_care_of_the_name(5)
10
그리고 당신이 사용하는 이유입니다 파이썬에서 권한 패러다임 보다 용서를 구하기 위해 더 쉬움을 입니다.
모든 객체의 메소드 목록을 얻는 가장 간단한 방법은 help()
명령 을 사용하는 것 입니다.
%help(object)
해당 객체와 관련된 사용 가능한 / 중요한 모든 메소드가 나열됩니다.
예를 들면 다음과 같습니다.
help(str)
%
첫 번째 예에서합니까? 파이썬 2.7에서는 작동하지 않습니다.
getAttrs
객체의 호출 가능한 속성 이름을 반환하는 함수를 만들 수 있습니다
def getAttrs(object):
return filter(lambda m: callable(getattr(object, m)), dir(object))
print getAttrs('Foo bar'.split(' '))
돌아올거야
['__add__', '__class__', '__contains__', '__delattr__', '__delitem__',
'__delslice__', '__eq__', '__format__', '__ge__', '__getattribute__',
'__getitem__', '__getslice__', '__gt__', '__iadd__', '__imul__', '__init__',
'__iter__', '__le__', '__len__', '__lt__', '__mul__', '__ne__', '__new__',
'__reduce__', '__reduce_ex__', '__repr__', '__reversed__', '__rmul__',
'__setattr__', '__setitem__', '__setslice__', '__sizeof__', '__str__',
'__subclasshook__', 'append', 'count', 'extend', 'index', 'insert', 'pop',
'remove', 'reverse', 'sort']
리스트를 객체로 가져 오기
obj = []
list(filter(lambda x:callable(getattr(obj,x)),obj.__dir__()))
당신은 얻는다 :
['__add__',
'__class__',
'__contains__',
'__delattr__',
'__delitem__',
'__dir__',
'__eq__',
'__format__',
'__ge__',
'__getattribute__',
'__getitem__',
'__gt__',
'__iadd__',
'__imul__',
'__init__',
'__init_subclass__',
'__iter__',
'__le__',
'__len__',
'__lt__',
'__mul__',
'__ne__',
'__new__',
'__reduce__',
'__reduce_ex__',
'__repr__',
'__reversed__',
'__rmul__',
'__setattr__',
'__setitem__',
'__sizeof__',
'__str__',
'__subclasshook__',
'append',
'clear',
'copy',
'count',
'extend',
'index',
'insert',
'pop',
'remove',
'reverse',
'sort']
... 메소드가 호출 될 때 단순히 오류가 발생하는지 확인하는 것 외에 특정 메소드가 있는지 확인하는 쉬운 방법이 있습니까?
" 허가보다 용서를 구하는 것이 더 쉽다 "는 확실히 파이썬적인 방법이지만, 당신이 찾고있는 것은 :
d={'foo':'bar', 'spam':'eggs'}
if 'get' in dir(d):
d.get('foo')
# OUT: 'bar'