2010-02-24 33 views
8

Giả sử tôi có một hệ thống gồm ba Lớp. GameClass tạo các phiên bản của cả hai lớp khác khi khởi tạo.OOP của Python - Mối quan hệ lớp học

class FieldClass: 
    def __init__(self): 
     return 
    def AnswerAQuestion(self):  
     return 42 

class PlayerClass: 
    def __init__(self): 
     return 
    def DoMagicHere(self): 
     # Access "AnswerAQuestion" located in the "FieldClass" instance in "GameClass" 
     pass 

class GameClass: 
    def __init__(self): 
     self.Field = FieldClass() 
     self.Player = PlayerClass() 

Điều gì sẽ là cách tốt nhất để tiếp cận AnswerAQuestion() nằm ở FieldClass từ bên trong thể hiện của PlayerClass?

  • Tôi có phải chuyển tham chiếu đến ví dụ FieldClass tới PlayerClass không?
  • Có cách nào khác, cách tốt hơn để giải quyết vấn đề này không? Làm như trên sẽ làm cho tôi phải bao gồm một biến bổ sung trong PlayerClass để giữ trường hợp FieldClass.
  • Có cách nào khác hoàn toàn để quản lý các mối quan hệ lớp bằng Python không?

Trả lời

6

tôi sẽ đi với Dependency Injection: nhanh chóng một GameClass với yêu cầu FieldClassPlayerClass trong cuộc gọi constructor vv (ví dụ: thay vì tạo các đối tượng phụ thuộc từ bên trong GameClass như bạn đang làm vào lúc này).

class GameClass: 
    def __init__(self, fc, pc): 
     self.Field = fc 
     self.Player = pc 

class PlayerClass: 
    def __init__(self, fc): 
     self.fc = fc 

    def DoMagicHere(self): 
     # use self.fc 
     pass 

fc=FieldClass() 
pc=PlayerClass(fc) 
gc=GameClass(fc, pc) 

Với DI, bạn có thể dễ dàng truy cập vào các thành viên bạn yêu cầu khi giai đoạn thiết lập hoàn tất.

4

Để hiểu rõ hơn về mối quan hệ lớp học của bạn, bạn phải cho chúng tôi biết thêm về dự án của bạn và những gì bạn đang cố gắng hoàn thành.

Một cách để tham khảo các dụ của FieldClass từ PlayerClass trong ví dụ của bạn là phải vượt qua các ví dụ GameClass đến PlayerClass dụ:

class PlayerClass: 
    def __init__(self, game): 
     self.game = game 
    def DoMagicHere(self): 
     self.game.Field.AnswerAQuestion() 

# ... 

class GameClass: 
    def __init__(self): 
     self.Field = FieldClass() 
     self.Player = PlayerClass(self) 

Một cách khác là để vượt qua field biến

class PlayerClass: 
    def __init__(self, field): 
     self.field = field 
    def DoMagicHere(self): 
     self.field.AnswerAQuestion() 
# ... 

class GameClass: 
    def __init__(self): 
     self.Field = FieldClass() 
     self.Player = PlayerClass(self.Field) 

Lưu ý: bạn sử dụng một lược đồ đặt tên đặc biệt. Tôi đề xuất điều này:

class Game: 
    def __init__(self): 
     self.field = Field() 
     self.player = Player(...) 

Tôi khuyên bạn nên đọc Python Style Guide trước khi có thói quen xấu.

+0

Cảm ơn thông tin về vấn đề đặt tên – lamas

+1

+1 để đề xuất cải thiện tên lớp học. –

0

Tôi sẽ làm điều gì đó tương tự như sau, nơi bạn chuyển Game thành tham chiếu ngược, cho phép bạn truy cập vào các lớp được liên kết khác. Bằng cách này, bạn có thể tùy chọn cung cấp cho cá thể người chơi đó một mối quan hệ trực tiếp với trường.

class FieldClass(object): 
    def __init__(self, game): 
     self.Game = game 
    def AnswerAQuestion(self):  
     return 42 

class PlayerClass(object): 
    def __init__(self, game): 
     self.Game = game 
     self.Field = game.Field # Optional 
    def DoMagicHere(self): 
     self.Game.Field.AnswerAQuestion() 
     self.Field.AnswerAQuestion() # Optional 

class GameClass(object): 
    def __init__(self): 
     self.Field = FieldClass(self) 
     self.Player = PlayerClass(self) 

Một mặt lưu ý là nó thực hành tốt tại có tất cả lớp học của bạn kế thừa từ object chứ không phải để họ đứng một mình.

1

Bạn có thể cung cấp bối cảnh cho các đối tượng trẻ, tức là .:

class FieldClass: 
    def __init__(self,game): 
    self.game = game 

class PlayerClass: 
    def __init__(self,game): 
    self.game = game 
    def DoMagicHere(self): 
    self.game.Field.AnswerAQuestion() 

class GameClass: 
    def __init__(self): 
    self.Field = FieldClass(self) 
    self.Player = PlayerClass(self) 

Kể từ khi đối tượng biết bối cảnh của họ, họ có thể đạt được vào nó và tiếp cận các đối tượng khác trong bối cảnh tương tự.

Các vấn đề liên quan