2010-11-05 57 views
7

Tôi hơi bối rối bởi mô hình đối tượng của Python. Tôi có hai lớp, một lớp kế thừa từ lớp kia.Tìm hiểu các đối tượng trong Python

class Node(): 
    def __init__(identifier): 
    self.identifier = identifier 

class Atom(Node): 
    def __init__(symbol) 
    self.symbol = symbol 

Những gì tôi đang cố gắng làm là không để ghi đè lên các phương pháp __ init __(), nhưng để tạo ra một thể hiện của nguyên tử đó sẽ có các thuộc tính biểu tượngđịnh danh.

Như thế này:

Atom("Fe", 1) # will create an atom with symbol "Fe" and identifier "1" 

Vì vậy, tôi muốn có thể truy cập Atom.identifier và Atom.symbol khi một thể hiện của Atom được tạo ra.

Tôi có thể làm như thế nào?

Trả lời

7

Ý tưởng hay là được kế thừa từ đối tượng trong mã của bạn.

+0

+1 cho kế thừa từ đối tượng –

+0

Không phải rất bảo trì ... – user470379

+0

@ user470379 Chăm sóc để xây dựng? Đây chỉ là một bằng chứng-khái niệm ... – Santa

6

Bạn phải gọi số __init__ -method của siêu hạng thủ công.

class Atom(Node): 
    def __init__(self, symbol, identifier) 
    Node.__init__(self, identifier) 
    self.symbol = symbol 
1
class Node(): 
    def __init__(self, identifier): 
    self.identifier = identifier 

class Atom(Node): 
    def __init__(self, symbol, *args, **kwargs) 
    super(Atom, self).__init__(*args, **kwargs) 
    self.symbol = symbol 

Xem here cho một lời giải thích của *args**kwargs. Bằng cách sử dụng super, bạn có thể truy cập lớp cơ sở (siêu lớp) của lớp Atom và gọi nó là __init__. Ngoài ra, tham số self cũng cần được bao gồm.

+0

Đó là thực hành tốt để gọi lớp cơ sở '__init__' phương pháp trước khi thực hiện bất kỳ khởi khác, mặc dù. –

+0

Bạn nói đúng, không suy nghĩ. Đã sửa. – user470379

2

Bạn có hai điều còn thiếu trong mã của bạn:

  1. phương pháp thuộc về một lớp phải có một self thông số rõ ràng, mà bạn đang thiếu

  2. có nguồn gốc lớp 'Atom' của bạn cũng cần để chấp nhận tham số cần sử dụng để khởi tạo lớp cơ sở.

Something như hơn:

class Node(): 
    def __init__(self, identifier): 
    self.identifier = identifier 

class Atom(Node): 
    def __init__(self, identifier, symbol) 
    Node.__init__(self, identifier) 
    self.symbol = symbol 
1
class Node(object): 
    def __init__(self, identifier): 
    self.identifier = identifier 

class Atom(Node): 
    def __init__(self, symbol, *args, **kwargs) 
    super(Atom, self).__init__(*args, **kwargs) 
    self.symbol = symbol 

điểm:

  • Node nên kế thừa từ object.
  • Sử dụng super để gọi các lớp cha mẹ '__init__ chức năng.
  • Các hàm thành viên của lớp lấy self làm tham số đầu tiên trong Python.
3

Khi tạo lớp bạn cần sử dụng từ tự trong khai báo. Sau đó bạn có thể xác định các đối số khác.Kế thừa gọi siêu init phương pháp:

>>> class Node(): 
... def __init__(self, identifier): 
...  self.identifier = identifier 
... 
>>> 
>>> class Atom(Node): 
... def __init__(self, symbol, identifier): 
...  Node.__init__(self, identifier) 
...  self.symbol = symbol 
... 
>>> 
>>> 
>>> fe = Atom("Fe", 1) 
>>> fe.symbol 
'Fe' 
>>> fe.identifier 
1 
>>> 
Các vấn đề liên quan