Bạn có thể sử dụng class inheritance đây. Thừa kế cho phép bạn tạo một đối tượng dựa trên một đối tượng khác, kế thừa tất cả các hàm và thuộc tính của nó.
Trong trường hợp này, nó trông giống như:
class A(object):
def foo(self):
print "blah"
class B(A):
# You can add new methods or attributes here,
# or even overwrite those inherited from A if you
# really want to, though you have to be careful with that.
pass
Sau khi tuyên bố rằng,
>>> B().foo()
"blah"
này hoạt động bởi vì:
- Bạn tạo lớp
A
, và tạo cho nó một phương pháp foo
.
- Bạn tạo lớp
B
kế thừa từ A
, có nghĩa là khi A
"đã sinh ra nó," B
được sinh ra với tất cả những gì A
có.
- Trong trường hợp của chúng tôi,
B
là bản sao chính xác của A
, vì chúng tôi không làm bất kỳ điều gì khác với nó. Tuy nhiên, chúng tôi có thể thực hiện thay đổi hoặc thêm các phương pháp khác.
Một ví dụ:
class A(object):
def foo(self):
print "blah"
class B(A):
def newfoo(self):
print "class A can't do this!"
nào được sử dụng, chúng ta sẽ thấy:
>>> A().foo()
blah
>>> B().foo()
blah
>>> A().newfoo()
Traceback (most recent call last):
File "<stdin>", line 1, in <module>
AttributeError: 'A' object has no attribute 'newfoo'
>>> B().newfoo()
class A can't do this!
Đặc biệt, lý do mà mã của bạn ở trên đã không làm việc là khi bạn cố gắng đặt B.foo
, bạn đã viết
class B(object):
foo = A.foo
thay vì
class B(object):
foo = A().foo
Khi bạn đã viết A.foo
mà không ()
, bạn được yêu cầu phương pháp trực tiếp từ A
loại, trong đó sẽ không làm việc trong Python. Nếu bạn đã làm foo = A().foo
, điều bạn sẽ làm là khởi tạo đối tượng A
và sau đó nhận bản sao phương thức foo
và sau đó gán nó.
Điều này sẽ có ý nghĩa hơn nếu 'foo' là một phương thức lớp thay vì một phương thức thể hiện. – NullUserException