Tôi muốn gọi một phương pháp để cho tôi một mệnh lệnh của tất cả các "không riêng tư" (tôi sử dụng thuật ngữ "riêng tư" hơi lỏng lẻo ở đây vì nó không thực sự tồn tại trong Python) và các thuộc tính không được xây dựng (tức là những thứ không bắt đầu bằng dấu gạch dưới đơn hoặc kép) trên một lớp. Một cái gì đó giống như vars (MyClass) sẽ chỉ trả về các thuộc tính "công khai" trên lớp đó.Có phương pháp Python nào để truy cập tất cả các thuộc tính không phải là riêng tư và không được xây dựng của một lớp không?
Tôi biết rằng
from M import *
không nhập khẩu đối tượng có tên bắt đầu bằng dấu gạch dưới. (http://www.python.org/dev/peps/pep-0008/#id25) Cách nhập thực hiện? Thông qua chức năng dựng sẵn hoặc chỉ bằng cách kiểm tra dấu gạch dưới? Cách pythonic để làm điều này là gì?
Ví dụ:
class MyClass(object):
def __init__(self):
do_stuff()
def _private(self):
print 'private'
def __gets_name_mangled(self:
print 'becomes _MyClass__gets_name_mangled()'
def public(self):
print 'public'
Nếu tôi làm
vars(MyClass).keys()
tôi nhận được
['_MyClass__gets_name_mangled', '__module__', '_private', '__doc__', '__dict__', '__weakref__', 'public', '__init__']
Làm thế nào tôi có thể nhận được chỉ
['public']
Hay tôi chỉ cần tự mình kiểm tra dấu gạch dưới? Nó chỉ có vẻ như sẽ có một cách nhiệt tình để làm điều này.
Để biết thêm về dấu gạch dưới và dấu gạch đôi, xem: What is the meaning of a single- and a double-underscore before an object name?
'vars (MyClass) .keys() 'là' dir (MyClass)' – Elazar
Tôi không biết về bất kỳ chức năng thực hiện điều này. Luôn luôn có: '[f cho f trong dir (MyClass) nếu không f.startswith ('_')]' – Blender
@Elazar nếu hiểu biết của tôi là đúng, dir (MyClass) sẽ trả về các thuộc tính của các lớp được phân lớp bởi MyClass (nếu MyClass đã xảy ra với phân lớp một cái gì đó) ngoài những người được xác định bên trong MyClass, trong khi vars (MyClass) chỉ trả về những thuộc tính được xác định bên trong MyClass. Sự khác biệt tinh tế. Nhưng câu hỏi ban đầu là viết tắt. – andy