2015-04-21 4 views
1

Я начинаю изучать Python, исходящий из Ruby on Rails.Найти атрибуты класса Python в оболочке

Мне интересно, есть ли способ просмотра атрибутов, принадлежащих классу через оболочку Python?

В Ruby мы просто вводим консоль и можем ввести имя класса и отобразить его атрибуты. Есть ли способ сделать это в Python?

Рубин Shell

2.2.0 :001 > User 
class User < ActiveRecord::Base { 
         :id => :integer, 
         :name => :string, 
        :email => :string, 
     :encrypted_password => :string, 
     :reset_password_token => :string, 
    :reset_password_sent_at => :datetime, 
     :remember_created_at => :datetime, 
      :sign_in_count => :integer, 
     :current_sign_in_at => :datetime, 
      :last_sign_in_at => :datetime, 
     :current_sign_in_ip => :string, 
      :last_sign_in_ip => :string, 
     :confirmation_token => :string, 
       :confirmed_at => :datetime, 
     :confirmation_sent_at => :datetime, 
     :unconfirmed_email => :string, 
       :created_at => :datetime, 
       :updated_at => :datetime, 
         :role => :string, 
         :bio => :text, 
         :sex => :string, 
        :title => :string, 
       :department => :string, 
        :keywords => :text, 
       :education => :text, 
        :skills => :text, 
      :invitation_token => :string, 
    :invitation_created_at => :datetime, 
     :invitation_sent_at => :datetime, 
    :invitation_accepted_at => :datetime, 
      :invitation_limit => :integer, 
      :invited_by_id => :integer, 
      :invited_by_type => :string, 
     :invitations_count => :integer 
} 
2.2.0 :002 > 

ответ

1

Используйте dir() функцию:

>>> print dir(str) 
['__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'] 

Он работает на любом объекте, в том числе классов, встроенных команд и функций.

Если вы хотите, чтобы вывод отформатированный больше как ваш рубинового например:

In [169]: for attrib in dir(str): 
    print "{0:18} => {1}".format(attrib, type(getattr(str, attrib))) 

Выход:

__add__   => <type 'wrapper_descriptor'> 
__class__   => <type 'type'> 
__contains__  => <type 'wrapper_descriptor'> 
__delattr__  => <type 'wrapper_descriptor'> 
__doc__   => <type 'str'> 
__eq__    => <type 'wrapper_descriptor'> 
__format__   => <type 'method_descriptor'> 
__ge__    => <type 'wrapper_descriptor'> 
__getattribute__ => <type 'wrapper_descriptor'> 
... 
+0

есть способ ТОЛЬКО захватить атрибуты, которые я создал? например, если пользователь был составлен только из электронной почты, он будет возвращать ТОЛЬКО электронную почту? как мой пример выше, возвращает только атрибуты, которые я создал – Fdwillis

+0

Вы можете отфильтровать атрибуты, начинающиеся с «__», но в противном случае 'dir()' не проводит различия между наследуемыми атрибутами и определенными пользователем. –

0

Вы на самом деле не нужно печатать. Вы можете просто использовать dir().

+0

Я использовал печать, потому что я хотел, чтобы все выводилось на одной строке - я не хотел брать 71 строку на странице. –