Hướng dẫn how do you pass one class to another class in python? - làm thế nào để bạn chuyển một lớp này sang một lớp khác trong python?

Tôi đang gặp một số rắc rối với các lớp học vào lúc này và tôi không chắc chắn làm thế nào để giải quyết vấn đề của mình. Tôi đã đọc các tài liệu và tôi không thể kết nối bất cứ điều gì nói ở đó với vấn đề tôi đang gặp phải.

Tôi đang cố gắng thực hiện một số lớp học đơn giản cho một trò chơi. Tôi có một lớp học vũ khí và một lớp học. Tôi đang cố gắng truyền một vũ khí cho lớp người (tôi hy vọng điều này có ý nghĩa), để người đó (Bob) có thể sử dụng vũ khí. Tôi đang gặp khó khăn khi truy cập các phương thức và thuộc tính trong lớp vũ khí. Tôi đã coi việc biến người thành một lớp vũ khí trẻ em để nó có thể gọi phương pháp một cách dễ dàng, nhưng điều đó dường như không trực quan với tôi. . .

class Weapon:
    def __init__(self, weapon_name, weapon_damage):
        self.weapon_name = weapon_name
        self.weapon_damage = weapon_damage

    def display_weapon_name(self):
        print('Weapon Name: %s' %self.weapon_name)


class Person:

    def __init__(self, person_name, health, ranged_weapon):
        self.person_name = person_name
        self.health = health
        Weapon.ranged_weapon = ranged_weapon

    def display_person_info(self):
        print('Name: %s' %self.person_name)
        print('Ranged Weapon :%s' %Weapon.display_weapon_name)

def ranged_attack(self, ranged_weapon, target):
    target.health -=ranged_weapon.weapon_damage
    print("Weapon: %s" %ranged_weapon.weapon_name)
    print(target.person_name + "'s Health: "+str(target.health))

pistol = Weapon("Pistol", 40)
bob = Person("Bob", 100, pistol)

bob.display_person_info()

Chạy cái này mang lại cho tôi:

Name: Bob
Ranged Weapon :<function Weapon.display_weapon_name at 0x02E23030>

Running:

bob.ranged_attack(pistol, bob)

Gives:

Weapon: Pistol
Bob's Health: 60

Câu hỏi của tôi là, tôi có phải chuyển đối tượng vũ khí một cách chính xác cho lớp người không? Có vẻ như vũ khí viết kỳ lạ.Ranged_Weapon trong _init__ thay vì self.ranged_weapon.

Làm thế nào tôi có thể lấy Display_WEAPON_INFO để hiển thị 'Tên vũ khí: Súng ngắn', chứ không phải là tham chiếu? Nó dường như hoạt động khi tôi gọi nó trong Ranged_attack, nhưng không có trong thông tin hiển thị.

Thực sự đánh giá cao bất kỳ sự giúp đỡ tôi có thể nhận được với điều này. Xin lỗi nếu một câu hỏi tương tự đã được hỏi trước đây, nhưng tôi không thể tìm thấy bất cứ điều gì tôi có thể liên quan đến vấn đề của mình.

Giàu có

Đọc 4 phút • Python 3.7. Python 3.7—3.10

Hướng dẫn how do you pass one class to another class in python? - làm thế nào để bạn chuyển một lớp này sang một lớp khác trong python?

Xem dưới dạng video

04:08

Đăng nhập vào tài khoản Python Barsels của bạn để lưu cài đặt screencast của bạn.

Vẫn chưa có tài khoản? Đăng ký tại đây.

Làm thế nào để thừa kế lớp hoạt động trong Python?

Tạo một lớp kế thừa từ một lớp khác

Chúng tôi có một lớp gọi là

Name: Bob
Ranged Weapon :<function Weapon.display_weapon_name at 0x02E23030>
6, kế thừa từ một lớp khác,
Name: Bob
Ranged Weapon :<function Weapon.display_weapon_name at 0x02E23030>
7 (nằm trong mô -đun
Name: Bob
Ranged Weapon :<function Weapon.display_weapon_name at 0x02E23030>
8 trong thư viện tiêu chuẩn Python):

from collections import Counter


class FancyCounter(Counter):
    def commonest(self):
        (value1, count1), (value2, count2) = self.most_common(2)
        if count1 == count2:
            raise ValueError("No unique most common value")
        return value1

Cách chúng ta biết chúng ta đang kế thừa từ lớp

Name: Bob
Ranged Weapon :<function Weapon.display_weapon_name at 0x02E23030>
7 bởi vì khi chúng ta xác định
Name: Bob
Ranged Weapon :<function Weapon.display_weapon_name at 0x02E23030>
6, ngay sau tên lớp, chúng ta đặt dấu ngoặc đơn và viết
Name: Bob
Ranged Weapon :<function Weapon.display_weapon_name at 0x02E23030>
7 bên trong chúng.

Để tạo một lớp kế thừa từ một lớp khác, sau tên lớp, bạn sẽ đặt dấu ngoặc đơn và sau đó liệt kê bất kỳ lớp nào mà lớp của bạn kế thừa.parentheses and then list any classes that your class inherits from.

Trong một định nghĩa chức năng, dấu ngoặc đơn sau tên hàm biểu thị các đối số mà hàm chấp nhận. Trong một định nghĩa lớp, dấu ngoặc đơn sau tên lớp thay vì đại diện cho các lớp được kế thừa.function definition, parentheses after the function name represent arguments that the function accepts. In a class definition the parentheses after the class name instead represent the classes being inherited from.

Thông thường khi thực hành kế thừa lớp học trong Python, chúng tôi thừa hưởng chỉ từ một lớp. Bạn có thể kế thừa từ nhiều lớp (được gọi là nhiều kế thừa), nhưng nó hơi hiếm. Chúng tôi sẽ chỉ thảo luận về kế thừa hạng đơn ngay bây giờ.just one class. You can inherit from multiple classes (that's called multiple inheritance), but it's a little bit rare. We'll only discuss single-class inheritance right now.

Phương pháp được kế thừa từ các lớp phụ huynh

Để sử dụng lớp

Name: Bob
Ranged Weapon :<function Weapon.display_weapon_name at 0x02E23030>
6 của chúng tôi, chúng tôi có thể gọi nó (giống như bất kỳ lớp nào khác):

>>> from fancy_counter import FancyCounter
>>> letters = FancyCounter("Hello there!")

Lớp của chúng tôi sẽ chấp nhận một chuỗi khi chúng tôi gọi nó vì lớp

Name: Bob
Ranged Weapon :<function Weapon.display_weapon_name at 0x02E23030>
7 đã triển khai phương thức
bob.ranged_attack(pistol, bob)
4 (phương thức khởi tạo).

Lớp của chúng tôi cũng có phương thức

bob.ranged_attack(pistol, bob)
5 cho một biểu diễn chuỗi đẹp:

>>> letters
FancyCounter({'e': 3, 'l': 2, 'H': 1, 'o': 1, ' ': 1, 't': 1, 'h': 1, 'r': 1, '!': 1})

Nó thậm chí còn có một loạt các chức năng khác quá. Ví dụ, nó đã ghi đè lên những gì xảy ra khi bạn sử dụng dấu ngoặc vuông để gán các cặp giá trị khóa trên các phiên bản lớp:

>>> letters['l'] = -2
>>> letters
FancyCounter({'e': 3, 'H': 1, 'o': 1, ' ': 1, 't': 1, 'h': 1, 'r': 1, '!': 1, 'l': -2})

Chúng ta có thể gán các cặp giá trị khóa vì lớp cha của chúng ta,

Name: Bob
Ranged Weapon :<function Weapon.display_weapon_name at 0x02E23030>
7 tạo ra các đối tượng giống như từ điển (ánh xạ a.k.a.).

Tất cả các chức năng đó được kế thừa từ lớp

Name: Bob
Ranged Weapon :<function Weapon.display_weapon_name at 0x02E23030>
7.inherited from the
Name: Bob
Ranged Weapon :<function Weapon.display_weapon_name at 0x02E23030>
7 class.

Thêm chức năng mới trong khi kế thừa

Vì vậy, lớp

Name: Bob
Ranged Weapon :<function Weapon.display_weapon_name at 0x02E23030>
6 của chúng tôi thừa hưởng tất cả các chức năng mà lớp
Name: Bob
Ranged Weapon :<function Weapon.display_weapon_name at 0x02E23030>
7 của chúng tôi có nhưng chúng tôi cũng đã mở rộng nó bằng cách thêm một phương thức bổ sung,
Weapon: Pistol
Bob's Health: 60
0, sẽ cung cấp cho chúng tôi mục phổ biến nhất trong lớp.

Khi chúng tôi gọi phương thức

Weapon: Pistol
Bob's Health: 60
0, chúng tôi sẽ nhận được chữ
Weapon: Pistol
Bob's Health: 60
2 (xảy ra ba lần trong chuỗi chúng tôi ban đầu cho đối tượng
Name: Bob
Ranged Weapon :<function Weapon.display_weapon_name at 0x02E23030>
6 của chúng tôi):

>>> letters.commonest()
'e'

Phương pháp

Weapon: Pistol
Bob's Health: 60
0 của chúng tôi dựa trên phương thức
Weapon: Pistol
Bob's Health: 60
5 mà chúng tôi không xác định nhưng lớp cha mẹ của chúng tôi,
Name: Bob
Ranged Weapon :<function Weapon.display_weapon_name at 0x02E23030>
7, đã xác định:

    def commonest(self):
        (value1, count1), (value2, count2) = self.most_common(2)
        if count1 == count2:
            raise ValueError("No unique most common value")
        return value1

Lớp

Name: Bob
Ranged Weapon :<function Weapon.display_weapon_name at 0x02E23030>
6 của chúng tôi có phương pháp
Weapon: Pistol
Bob's Health: 60
8 vì lớp cha của chúng tôi,
Name: Bob
Ranged Weapon :<function Weapon.display_weapon_name at 0x02E23030>
7 đã xác định nó cho chúng tôi!

Ghi đè các phương pháp kế thừa

Nếu chúng tôi muốn tùy chỉnh những gì xảy ra khi chúng tôi gán cho một cặp giá trị khóa trong lớp này, chúng tôi có thể làm điều đó bằng cách ghi đè phương thức

from collections import Counter


class FancyCounter(Counter):
    def commonest(self):
        (value1, count1), (value2, count2) = self.most_common(2)
        if count1 == count2:
            raise ValueError("No unique most common value")
        return value1
0. Ví dụ: hãy làm cho nó để nếu chúng ta gán một khóa cho một giá trị âm, thay vào đó, nó gán nó cho
from collections import Counter


class FancyCounter(Counter):
    def commonest(self):
        (value1, count1), (value2, count2) = self.most_common(2)
        if count1 == count2:
            raise ValueError("No unique most common value")
        return value1
1.

Trước khi chúng tôi gán

from collections import Counter


class FancyCounter(Counter):
    def commonest(self):
        (value1, count1), (value2, count2) = self.most_common(2)
        if count1 == count2:
            raise ValueError("No unique most common value")
        return value1
2 cho
from collections import Counter


class FancyCounter(Counter):
    def commonest(self):
        (value1, count1), (value2, count2) = self.most_common(2)
        if count1 == count2:
            raise ValueError("No unique most common value")
        return value1
3, chúng tôi muốn nó được đặt thành
from collections import Counter


class FancyCounter(Counter):
    def commonest(self):
        (value1, count1), (value2, count2) = self.most_common(2)
        if count1 == count2:
            raise ValueError("No unique most common value")
        return value1
1 thay vì
from collections import Counter


class FancyCounter(Counter):
    def commonest(self):
        (value1, count1), (value2, count2) = self.most_common(2)
        if count1 == count2:
            raise ValueError("No unique most common value")
        return value1
3 (đó là
from collections import Counter


class FancyCounter(Counter):
    def commonest(self):
        (value1, count1), (value2, count2) = self.most_common(2)
        if count1 == count2:
            raise ValueError("No unique most common value")
        return value1
3 ở đây vì chúng tôi chưa tùy chỉnh điều này):

Name: Bob
Ranged Weapon :<function Weapon.display_weapon_name at 0x02E23030>
0

Để tùy chỉnh hành vi này, chúng tôi sẽ thực hiện một phương thức

from collections import Counter


class FancyCounter(Counter):
    def commonest(self):
        (value1, count1), (value2, count2) = self.most_common(2)
        if count1 == count2:
            raise ValueError("No unique most common value")
        return value1
0 chấp nhận
from collections import Counter


class FancyCounter(Counter):
    def commonest(self):
        (value1, count1), (value2, count2) = self.most_common(2)
        if count1 == count2:
            raise ValueError("No unique most common value")
        return value1
8,
from collections import Counter


class FancyCounter(Counter):
    def commonest(self):
        (value1, count1), (value2, count2) = self.most_common(2)
        if count1 == count2:
            raise ValueError("No unique most common value")
        return value1
9 và
>>> from fancy_counter import FancyCounter
>>> letters = FancyCounter("Hello there!")
0 vì đó là những gì
from collections import Counter


class FancyCounter(Counter):
    def commonest(self):
        (value1, count1), (value2, count2) = self.most_common(2)
        if count1 == count2:
            raise ValueError("No unique most common value")
        return value1
0 được Python đưa ra khi nó được gọi là:

Name: Bob
Ranged Weapon :<function Weapon.display_weapon_name at 0x02E23030>
1

Phương pháp

from collections import Counter


class FancyCounter(Counter):
    def commonest(self):
        (value1, count1), (value2, count2) = self.most_common(2)
        if count1 == count2:
            raise ValueError("No unique most common value")
        return value1
0 trên về cơ bản nói: Nếu
>>> from fancy_counter import FancyCounter
>>> letters = FancyCounter("Hello there!")
0 âm tính, hãy đặt nó thành
from collections import Counter


class FancyCounter(Counter):
    def commonest(self):
        (value1, count1), (value2, count2) = self.most_common(2)
        if count1 == count2:
            raise ValueError("No unique most common value")
        return value1
1.

Nếu chúng tôi ngừng viết

from collections import Counter


class FancyCounter(Counter):
    def commonest(self):
        (value1, count1), (value2, count2) = self.most_common(2)
        if count1 == count2:
            raise ValueError("No unique most common value")
        return value1
0 tại thời điểm này, nó sẽ không hữu ích. Trên thực tế, phương pháp
from collections import Counter


class FancyCounter(Counter):
    def commonest(self):
        (value1, count1), (value2, count2) = self.most_common(2)
        if count1 == count2:
            raise ValueError("No unique most common value")
        return value1
0 sẽ không làm gì cả: nó sẽ không gây ra lỗi, nhưng nó cũng không thực sự làm gì cả!

Để làm điều gì đó hữu ích, chúng ta cần gọi phương thức

from collections import Counter


class FancyCounter(Counter):
    def commonest(self):
        (value1, count1), (value2, count2) = self.most_common(2)
        if count1 == count2:
            raise ValueError("No unique most common value")
        return value1
0 của lớp cha. Chúng ta có thể gọi phương thức
from collections import Counter


class FancyCounter(Counter):
    def commonest(self):
        (value1, count1), (value2, count2) = self.most_common(2)
        if count1 == count2:
            raise ValueError("No unique most common value")
        return value1
0 của lớp cha của chúng ta bằng cách sử dụng
>>> from fancy_counter import FancyCounter
>>> letters = FancyCounter("Hello there!")
9.

Name: Bob
Ranged Weapon :<function Weapon.display_weapon_name at 0x02E23030>
2

Chúng tôi đang gọi

>>> letters
FancyCounter({'e': 3, 'l': 2, 'H': 1, 'o': 1, ' ': 1, 't': 1, 'h': 1, 'r': 1, '!': 1})
0, sẽ gọi phương thức
from collections import Counter


class FancyCounter(Counter):
    def commonest(self):
        (value1, count1), (value2, count2) = self.most_common(2)
        if count1 == count2:
            raise ValueError("No unique most common value")
        return value1
0 trên lớp cha của chúng tôi (
Name: Bob
Ranged Weapon :<function Weapon.display_weapon_name at 0x02E23030>
7) với
from collections import Counter


class FancyCounter(Counter):
    def commonest(self):
        (value1, count1), (value2, count2) = self.most_common(2)
        if count1 == count2:
            raise ValueError("No unique most common value")
        return value1
9 và
>>> from fancy_counter import FancyCounter
>>> letters = FancyCounter("Hello there!")
0 không âm mới của chúng tôi.

Dưới đây là triển khai đầy đủ phiên bản mới này của lớp

Name: Bob
Ranged Weapon :<function Weapon.display_weapon_name at 0x02E23030>
6 của chúng tôi:

Name: Bob
Ranged Weapon :<function Weapon.display_weapon_name at 0x02E23030>
3

Để sử dụng lớp này, chúng tôi sẽ gọi nó và chuyển trong một chuỗi một lần nữa:

>>> from fancy_counter import FancyCounter
>>> letters = FancyCounter("Hello there!")

Nhưng lần này, nếu chúng ta gán một khóa cho một giá trị âm, chúng ta sẽ thấy rằng nó sẽ được gán cho

from collections import Counter


class FancyCounter(Counter):
    def commonest(self):
        (value1, count1), (value2, count2) = self.most_common(2)
        if count1 == count2:
            raise ValueError("No unique most common value")
        return value1
1 thay thế:

Name: Bob
Ranged Weapon :<function Weapon.display_weapon_name at 0x02E23030>
5

Bài tập lớp cho người mới bắt đầu nâng cao

Bạn muốn một số thực hành hơn với các lớp học trong Python?

Lặn vào đường tập thể dục bao gồm 6 bài tập lớp cho người mới bắt đầu nâng cao. Python Morsels cũng bao gồm hàng chục bài tập khác về các lớp học và Python hướng đối tượng là tốt.6 class exercises for advanced beginners. Python Morsels also includes dozens more exercises on classes and object-oriented Python as well.

✨ Hãy thử lặn vào các bài tập các lớp ✨

Sê -ri: Lớp học

Các lớp học là một cách để gói chức năng và trạng thái cùng nhau. Các thuật ngữ "loại" và "lớp" có thể hoán đổi cho nhau:

>>> letters
FancyCounter({'e': 3, 'l': 2, 'H': 1, 'o': 1, ' ': 1, 't': 1, 'h': 1, 'r': 1, '!': 1})
7,
>>> letters
FancyCounter({'e': 3, 'l': 2, 'H': 1, 'o': 1, ' ': 1, 't': 1, 'h': 1, 'r': 1, '!': 1})
8,
>>> letters
FancyCounter({'e': 3, 'l': 2, 'H': 1, 'o': 1, ' ': 1, 't': 1, 'h': 1, 'r': 1, '!': 1})
9,
>>> letters['l'] = -2
>>> letters
FancyCounter({'e': 3, 'H': 1, 'o': 1, ' ': 1, 't': 1, 'h': 1, 'r': 1, '!': 1, 'l': -2})
0,
>>> letters['l'] = -2
>>> letters
FancyCounter({'e': 3, 'H': 1, 'o': 1, ' ': 1, 't': 1, 'h': 1, 'r': 1, '!': 1, 'l': -2})
1,
>>> letters['l'] = -2
>>> letters
FancyCounter({'e': 3, 'H': 1, 'o': 1, ' ': 1, 't': 1, 'h': 1, 'r': 1, '!': 1, 'l': -2})
2 và
>>> letters['l'] = -2
>>> letters
FancyCounter({'e': 3, 'H': 1, 'o': 1, ' ': 1, 't': 1, 'h': 1, 'r': 1, '!': 1, 'l': -2})
3 đều là tất cả các lớp.

Chắc chắn bạn sẽ sử dụng khá nhiều lớp trong Python (các loại nhớ là các lớp) nhưng bạn có thể không cần phải tự tạo thường xuyên.

Để theo dõi tiến trình của bạn trên con đường chủ đề Python Barsels này, đăng nhập hoặc đăng ký.

Một mẹo Python mỗi tuần

Cần lấp đầy khoảng trống trong các kỹ năng trăn của bạn? Tôi gửi email hàng tuần được thiết kế để làm điều đó.fill-in gaps in your Python skills? I send weekly emails designed to do just that.

Làm thế nào để bạn chuyển một lớp học cho một lớp học khác trong Python?

Để tạo một lớp kế thừa từ một lớp khác, sau tên lớp, bạn sẽ đặt dấu ngoặc đơn và sau đó liệt kê bất kỳ lớp nào mà lớp của bạn kế thừa. Trong một định nghĩa chức năng, dấu ngoặc đơn sau tên hàm biểu thị các đối số mà hàm chấp nhận.after the class name you'll put parentheses and then list any classes that your class inherits from. In a function definition, parentheses after the function name represent arguments that the function accepts.

Bạn có thể vượt qua một lớp học ở Python không?

Có của thô, bạn có thể vượt qua các lớp hoặc chức năng hoặc thậm chí các mô -đun ... def foo (): Truyền ở đây nó cung cấp địa chỉ cho Ex. Chức năng FOO AT0X024E4463 có nghĩa là nó được cung cấp địa chỉ của hàm foo nhưng trong lớp Itdoesnt có nghĩa là lớp foo: Pass ở đây nó đưa ra ... def foo(): pass here it gives it address for ex. function foo at0x024E4463 means it is given address of foo function but in class itdoesnt means class foo: pass here it gives

Làm cách nào để chuyển giá trị từ lớp này sang lớp khác trong Python?

Trong [1]: Lớp foo: ...: def __init __ (tự): ...: tự.var = 1 ...
Nhận một biến từ lớp A, sử dụng đối tượng của nó ..
Chuyển nó như một đối số cho một hàm của lớp B (truy cập hàm này bằng cách sử dụng đối tượng của lớp B) ..
Hàm này sẽ chuyển giá trị của biến này cho một biến trong lớp B ..

Làm thế nào để bạn mở rộng một lớp này sang lớp khác trong Python?

Sử dụng lớp Cú pháp kế thừa DeriveSclass (Baseclass) để mở rộng một lớp.Sử dụng lớp cú pháp DeriveSclass (baseclass) để mở rộng baseclass dưới dạng class, do đó, DeridedClass thừa hưởng Baseclass.. Use the syntax class DerivedClass(BaseClass) to extend BaseClass as DerivedClass , so that DerivedClass inherits BaseClass .