2011-12-22 34 views
5

trong python Tôi đang cố gắng truy cập một biến mẫu nơi tôi cần sử dụng giá trị của biến khác để xác định tên: Example Instance Variable: user.remote.directory nơi nó trỏ đến giá trị của 'servername:/mnt/.....' và phần người dùng chứa userid của người dùng, chẳng hạn như joe.remote.directorypython: Truy cập một biến mẫu bằng cách sử dụng tên có chứa biến

từ một lớp khác mà tôi cần để có thể truy cập joe.remote.directory sử dụng biến chứa id người dùng của joe. Tôi đã thử variable.remote.directory nhưng nó không hoạt động, bất cứ đề nghị?

+3

Có gần như luôn luôn là một cách tốt hơn để làm điều này. Trong khi Python cho phép bạn truy cập các biến bằng cách sử dụng các tên chuỗi, nó thực sự kludgy và thực sự có thể làm chậm * toàn bộ chương trình của bạn (khi Python phát hiện bạn đang làm điều này, nó phải tắt toàn bộ các tối ưu hóa làm). –

Trả lời

3

Bạn có thể tham khảo để biến dụ gọi name của đối tượng obj theo cách này:

obj.__dict__['name'] 

Do đó, nếu bạn có một biến prop mà giữ tên của biến Ví dụ bạn muốn tham khảo, bạn có thể làm theo cách này:

obj.__dict__[prop] 

Nếu bạn thấy mình cần chức năng này, bạn nên tự hỏi mình cho dù đó không phải là trong thực tế, một hoàn cảnh tốt để sử dụng một thể hiện của dict để thay thế.

1

Tôi khuyên bạn nên tạo thêm Đối tượng người dùng, mà bạn chuyển đến Đối tượng hoặc chức năng thích hợp nếu cần. Bạn đang cực kỳ mơ hồ, vì vậy thật khó để cung cấp cho bạn một lời khuyên thực tế hơn.

Ví dụ:

class User: 
    def __init__(self, name, uid=None, remote=None, dir=None): 
     self.name = name 
     self.uid = uid 
     self.remote = remote 
     self.directory = dir 

    def get_X(self) 
     ... 

    def create_some_curios_String(self): 
     """ for uid = 'joe', remote='localhost' and directory = '/mnt/srv' 
      this method would return the string: 
      '[email protected]://mnt/srv' 
     """ 
     return '%[email protected]%s:/%s' % (self.uid, self.remote, self.directory) 


class AnotherClass: 
    def __init__(self, user_obj): 
     self.user = user_obj 

class YetAnotherClass: 
    def getServiceOrFunctionalityForUser(self, user): 
     doWhatEverNeedsToBeDoneWithUser(user) 
     doWhatEverNeedsToBeDoneWithUserUIDandRemote(user.uid, user.remote) 

joe = User('Joe Smith', 'joe', 'localhost', '/mnt/srv') 
srv_service = ServerService(joe.create_some_curios_String()) 
srv_service.do_something_super_important() 
Các vấn đề liên quan