Hướng dẫn how do you find the parent class method in python? - làm thế nào để bạn tìm thấy phương thức của lớp cha trong python?

Khi tạo một hệ thống phân cấp đối tượng đơn giản trong Python, tôi muốn có thể gọi các phương thức của lớp cha từ một lớp dẫn xuất. Trong Perl và Java, có một từ khóa cho điều này (

class Foo(Bar):
    def baz(self, **kwargs):
        return super().baz(**kwargs)
9). Ở Perl, tôi có thể làm điều này:

package Foo;

sub frotz {
    return "Bamf";
}

package Bar;
@ISA = qw(Foo);

sub frotz {
   my $str = SUPER::frotz();
   return uc($str);
}

Trong Python, có vẻ như tôi phải đặt tên cho lớp cha mẹ một cách rõ ràng từ đứa trẻ. Trong ví dụ trên, tôi phải làm một cái gì đó như

class Foo(Bar):
    def baz(self, arg):
        return super(Foo, self).baz(arg)
0.

Điều này dường như không đúng vì hành vi này làm cho nó khó thực hiện các hệ thống phân cấp sâu. Nếu trẻ em cần biết lớp nào xác định một phương pháp di truyền, thì tất cả các loại đau thông tin được tạo ra.

Đây có phải là một giới hạn thực sự trong Python, một khoảng cách trong sự hiểu biết của tôi hay cả hai?

Hướng dẫn how do you find the parent class method in python? - làm thế nào để bạn tìm thấy phương thức của lớp cha trong python?

Siêu bão

4.7585 Huy hiệu vàng20 Huy hiệu bạc33 Huy hiệu Đồng5 gold badges20 silver badges33 bronze badges

Hỏi ngày 30 tháng 4 năm 2009 lúc 1:52Apr 30, 2009 at 1:52

3

Sử dụng chức năng

class Foo(Bar):
    def baz(self, arg):
        return super(Foo, self).baz(arg)
1:

class Foo(Bar):
    def baz(self, **kwargs):
        return super().baz(**kwargs)

Đối với Python <3, bạn phải chọn cách sử dụng các lớp kiểu mới và sử dụng:

class Foo(Bar):
    def baz(self, arg):
        return super(Foo, self).baz(arg)

Hướng dẫn how do you find the parent class method in python? - làm thế nào để bạn tìm thấy phương thức của lớp cha trong python?

Jason m

6.26320 Huy hiệu vàng68 Huy hiệu bạc118 Huy hiệu đồng20 gold badges68 silver badges118 bronze badges

Đã trả lời ngày 30 tháng 4 năm 2009 lúc 1:58Apr 30, 2009 at 1:58

Adam Rosenfieldadam RosenfieldAdam Rosenfield

381K96 Huy hiệu vàng510 Huy hiệu bạc585 Huy hiệu Đồng96 gold badges510 silver badges585 bronze badges

15

Python cũng có siêu

class Foo(Bar):
    def baz(self, arg):
        return super(Foo, self).baz(arg)
2

Trả về một đối tượng proxy ủy quyền gọi cho một loại phụ huynh hoặc anh chị em của loại. Điều này rất hữu ích cho việc truy cập các phương thức kế thừa đã được ghi đè trong một lớp. Thứ tự tìm kiếm giống như được sử dụng bởi getAttr () ngoại trừ loại chính loại bị bỏ qua.

Thí dụ:

class A(object):     # deriving from 'object' declares A as a 'new-style-class'
    def foo(self):
        print "foo"

class B(A):
    def foo(self):
        super(B, self).foo()   # calls 'A.foo()'

myB = B()
myB.foo()

Đã trả lời ngày 30 tháng 4 năm 2009 lúc 1:58Apr 30, 2009 at 1:58

Adam Rosenfieldadam RosenfieldJay

381K96 Huy hiệu vàng510 Huy hiệu bạc585 Huy hiệu Đồng14 gold badges65 silver badges83 bronze badges

3

Python cũng có siêu

Trả về một đối tượng proxy ủy quyền gọi cho một loại phụ huynh hoặc anh chị em của loại. Điều này rất hữu ích cho việc truy cập các phương thức kế thừa đã được ghi đè trong một lớp. Thứ tự tìm kiếm giống như được sử dụng bởi getAttr () ngoại trừ loại chính loại bị bỏ qua.

Thí dụ:Apr 30, 2009 at 2:02

JayjayAlex Martelli

41K14 Huy hiệu vàng65 Huy hiệu bạc83 Huy hiệu Đồng163 gold badges1204 silver badges1383 bronze badges

5

ImmediateParentClass.frotz(self)
has a different and simpler syntax for calling parent method.

sẽ chỉ ổn, cho dù lớp cha mẹ ngay lập tức đã xác định

class Foo(Bar):
    def baz(self, arg):
        return super(Foo, self).baz(arg)
3 hoặc kế thừa nó.
class Foo(Bar):
    def baz(self, **kwargs):
        return super().baz(**kwargs)
9 chỉ cần thiết để hỗ trợ thích hợp cho nhiều kế thừa (và sau đó nó chỉ hoạt động nếu mỗi lớp sử dụng nó đúng cách). Nói chung,
class Foo(Bar):
    def baz(self, arg):
        return super(Foo, self).baz(arg)
5 sẽ tìm kiếm
class Foo(Bar):
    def baz(self, arg):
        return super(Foo, self).baz(arg)
6 trong tổ tiên của ____ 27 nếu
class Foo(Bar):
    def baz(self, arg):
        return super(Foo, self).baz(arg)
7 không xác định/ghi đè nó và điều này đúng với "phương pháp gọi của lớp con" như bất kỳ sự cố nào khác!

class Foo(Bar):

    def __init__(self, *args, **kwargs):
        # invoke Bar.__init__
        super().__init__(*args, **kwargs)

Đã trả lời ngày 30 tháng 4 năm 2009 lúc 2:02Jul 26, 2016 at 10:12

Hướng dẫn how do you find the parent class method in python? - làm thế nào để bạn tìm thấy phương thức của lớp cha trong python?

Alex Martellialex MartelliArun Ghosh

828K163 Huy hiệu vàng1204 Huy hiệu bạc1383 Huy hiệu Đồng1 gold badge24 silver badges38 bronze badges

1

Python 3 có một cú pháp khác nhau và đơn giản hơn để gọi phương thức cha mẹ.

Nếu lớp

class Foo(Bar):
    def baz(self, arg):
        return super(Foo, self).baz(arg)
9 kế thừa từ
class A(object):     # deriving from 'object' declares A as a 'new-style-class'
    def foo(self):
        print "foo"

class B(A):
    def foo(self):
        super(B, self).foo()   # calls 'A.foo()'

myB = B()
myB.foo()
0, thì từ
class A(object):     # deriving from 'object' declares A as a 'new-style-class'
    def foo(self):
        print "foo"

class B(A):
    def foo(self):
        super(B, self).foo()   # calls 'A.foo()'

myB = B()
myB.foo()
1 có thể được gọi từ
class Foo(Bar):
    def baz(self, arg):
        return super(Foo, self).baz(arg)
9 qua
class A(object):     # deriving from 'object' declares A as a 'new-style-class'
    def foo(self):
        print "foo"

class B(A):
    def foo(self):
        super(B, self).foo()   # calls 'A.foo()'

myB = B()
myB.foo()
3:

Đã trả lời ngày 26 tháng 7 năm 2016 lúc 10:12

Arun Ghosharun Ghosh

7,4421 Huy hiệu vàng24 Huy hiệu bạc38 Huy hiệu đồng

Nhiều câu trả lời đã giải thích cách gọi một phương thức từ cha mẹ đã bị ghi đè vào đứa trẻ.

Tuy nhiên

class A():
  def bar(self, string):
    print("Hi, I'm bar, inherited from A"+string)

class B(A):
  def baz(self):
    self.bar(" - called by baz in B")

B().baz() # prints out "Hi, I'm bar, inherited from A - called by baz in B"

"Làm thế nào để bạn gọi phương pháp của lớp cha từ lớp con?"

Cũng có thể có nghĩa là:

"Làm thế nào để bạn gọi các phương thức kế thừa?"Jul 11, 2017 at 14:32

Bạn có thể gọi các phương thức được kế thừa từ một lớp cha mẹ giống như chúng là phương pháp của lớp con, miễn là chúng không bị ghi đè.Ben

ví dụ. Trong Python 3:6 silver badges16 bronze badges

5

Vâng, điều này có thể khá rõ ràng, nhưng tôi cảm thấy rằng nếu không chỉ ra điều này, mọi người có thể để lại chủ đề này với ấn tượng bạn phải nhảy qua các vòng vô lý chỉ để truy cập các phương pháp di truyền trong Python. Đặc biệt là câu hỏi này đánh giá cao trong các tìm kiếm "Cách truy cập phương thức của lớp cha trong Python" và OP được viết từ góc độ của một người mới đến Python.super():

#New-style classes inherit from object, or from another new-style class
class Dog(object):

    name = ''
    moves = []

    def __init__(self, name):
        self.name = name

    def moves_setup(self):
        self.moves.append('walk')
        self.moves.append('run')

    def get_moves(self):
        return self.moves

class Superdog(Dog):

    #Let's try to append new fly ability to our Superdog
    def moves_setup(self):
        #Set default moves by calling method of parent class
        super(Superdog, self).moves_setup()
        self.moves.append('fly')

dog = Superdog('Freddy')
print dog.name # Freddy
dog.moves_setup()
print dog.get_moves() # ['walk', 'run', 'fly']. 
#As you can see our Superdog has all moves defined in the base Dog class

Tôi đã tìm thấy: https://docs.python.org/3/tutorial/classes.html#inheritance để hữu ích trong việc hiểu cách bạn truy cập các phương thức di truyền.Apr 17, 2013 at 10:44

Hướng dẫn how do you find the parent class method in python? - làm thế nào để bạn tìm thấy phương thức của lớp cha trong python?

Đã trả lời ngày 11 tháng 7 năm 2017 lúc 14:32yesnik

Benben1 gold badge27 silver badges22 bronze badges

1

8536 Huy hiệu bạc16 Huy hiệu Đồng

class Foo(Bar):
    def __init__(self):
        super(Foo, self).__init__()
        self.baz = 5

Đã trả lời ngày 30 tháng 4 năm 2009 lúc 1:58Apr 30, 2009 at 1:58

Adam Rosenfieldadam Rosenfieldlawrence

381K96 Huy hiệu vàng510 Huy hiệu bạc585 Huy hiệu Đồng5 gold badges37 silver badges50 bronze badges

0

Python cũng có siêu

class A:
   def __init__(self):
        print "I am Class %s"%self.__class__.__name__
        for parentClass in self.__class__.__bases__:
              print "   I am inherited from:",parentClass.__name__
              #parentClass.foo(self) <- call parents function with self as first param
class B(A):pass
class C(B):pass
a,b,c = A(),B(),C()

Trả về một đối tượng proxy ủy quyền gọi cho một loại phụ huynh hoặc anh chị em của loại. Điều này rất hữu ích cho việc truy cập các phương thức kế thừa đã được ghi đè trong một lớp. Thứ tự tìm kiếm giống như được sử dụng bởi getAttr () ngoại trừ loại chính loại bị bỏ qua.Dec 31, 2011 at 17:39

Thí dụ:Joran Beasley

Jayjay12 gold badges149 silver badges174 bronze badges

1

41K14 Huy hiệu vàng65 Huy hiệu bạc83 Huy hiệu Đồng

ImmediateParentClass.frotz(self)

class Foo(Bar):
    def baz(self, **kwargs):
        return super().baz(**kwargs)
0

sẽ chỉ ổn, cho dù lớp cha mẹ ngay lập tức đã xác định

class Foo(Bar):
    def baz(self, arg):
        return super(Foo, self).baz(arg)
3 hoặc kế thừa nó.
class Foo(Bar):
    def baz(self, **kwargs):
        return super().baz(**kwargs)
9 chỉ cần thiết để hỗ trợ thích hợp cho nhiều kế thừa (và sau đó nó chỉ hoạt động nếu mỗi lớp sử dụng nó đúng cách). Nói chung,
class Foo(Bar):
    def baz(self, arg):
        return super(Foo, self).baz(arg)
5 sẽ tìm kiếm
class Foo(Bar):
    def baz(self, arg):
        return super(Foo, self).baz(arg)
6 trong tổ tiên của ____ 27 nếu
class Foo(Bar):
    def baz(self, arg):
        return super(Foo, self).baz(arg)
7 không xác định/ghi đè nó và điều này đúng với "phương pháp gọi của lớp con" như bất kỳ sự cố nào khác!

Đã trả lời ngày 30 tháng 4 năm 2009 lúc 2:02Dec 10, 2014 at 13:21

Alex Martellialex Martellikkk

828K163 Huy hiệu vàng1204 Huy hiệu bạc1383 Huy hiệu Đồng1 gold badge24 silver badges44 bronze badges

Python 3 có một cú pháp khác nhau và đơn giản hơn để gọi phương thức cha mẹ.

class Foo(Bar):
    def baz(self, **kwargs):
        return super().baz(**kwargs)
1

Nếu lớp

class Foo(Bar):
    def baz(self, arg):
        return super(Foo, self).baz(arg)
9 kế thừa từ
class A(object):     # deriving from 'object' declares A as a 'new-style-class'
    def foo(self):
        print "foo"

class B(A):
    def foo(self):
        super(B, self).foo()   # calls 'A.foo()'

myB = B()
myB.foo()
0, thì từ
class A(object):     # deriving from 'object' declares A as a 'new-style-class'
    def foo(self):
        print "foo"

class B(A):
    def foo(self):
        super(B, self).foo()   # calls 'A.foo()'

myB = B()
myB.foo()
1 có thể được gọi từ
class Foo(Bar):
    def baz(self, arg):
        return super(Foo, self).baz(arg)
9 qua
class A(object):     # deriving from 'object' declares A as a 'new-style-class'
    def foo(self):
        print "foo"

class B(A):
    def foo(self):
        super(B, self).foo()   # calls 'A.foo()'

myB = B()
myB.foo()
3:

class Foo(Bar):
    def baz(self, **kwargs):
        return super().baz(**kwargs)
2

Đã trả lời ngày 26 tháng 7 năm 2016 lúc 10:12

Arun Ghosharun Ghosh7 gold badges62 silver badges69 bronze badges

7,4421 Huy hiệu vàng24 Huy hiệu bạc38 Huy hiệu đồngOct 30, 2018 at 14:53

Nhiều câu trả lời đã giải thích cách gọi một phương thức từ cha mẹ đã bị ghi đè vào đứa trẻ.Khan

Tuy nhiên10 silver badges11 bronze badges

Trong Python 2, tôi không gặp nhiều may mắn với Super (). Tôi đã sử dụng câu trả lời từ Jimifiki về chủ đề này Làm thế nào để tham khảo phương thức cha mẹ trong Python ?. Sau đó, tôi đã thêm xoắn nhỏ của riêng mình vào nó, mà tôi nghĩ là một sự cải thiện về khả năng sử dụng (đặc biệt nếu bạn có tên lớp dài).

Xác định lớp cơ sở trong một mô -đun:

class Foo(Bar):
    def baz(self, **kwargs):
        return super().baz(**kwargs)
3

Sau đó nhập lớp vào một mô -đun khác

class A(object):     # deriving from 'object' declares A as a 'new-style-class'
    def foo(self):
        print "foo"

class B(A):
    def foo(self):
        super(B, self).foo()   # calls 'A.foo()'

myB = B()
myB.foo()
9:

class Foo(Bar):
    def baz(self, **kwargs):
        return super().baz(**kwargs)
4

Đã trả lời ngày 21 tháng 1 năm 2017 lúc 19:12Jan 21, 2017 at 19:12

Hướng dẫn how do you find the parent class method in python? - làm thế nào để bạn tìm thấy phương thức của lớp cha trong python?

BUVINJBUVINJBuvinJ

9.5935 huy hiệu vàng74 Huy hiệu bạc87 Huy hiệu đồng5 gold badges74 silver badges87 bronze badges

2

class Foo(Bar):
    def baz(self, **kwargs):
        return super().baz(**kwargs)
5

Đã trả lời ngày 28 tháng 3 năm 2019 lúc 6:39Mar 28, 2019 at 6:39

Hướng dẫn how do you find the parent class method in python? - làm thế nào để bạn tìm thấy phương thức của lớp cha trong python?

Nếu bạn muốn gọi phương thức của bất kỳ lớp nào, bạn chỉ cần gọi

ImmediateParentClass.frotz(self)
0 trên bất kỳ trường hợp nào của lớp. Nếu kế thừa của bạn tương đối sạch sẽ, điều này cũng sẽ hoạt động trên các trường hợp của một lớp con:

class Foo(Bar):
    def baz(self, **kwargs):
        return super().baz(**kwargs)
6

Đã trả lời ngày 14 tháng 1 lúc 17:05Jan 14 at 17:05

Philosofoolphilosofoolphilosofool

7093 Huy hiệu bạc11 Huy hiệu đồng3 silver badges11 bronze badges

class Foo(Bar):
    def baz(self, **kwargs):
        return super().baz(**kwargs)
7

Hướng dẫn how do you find the parent class method in python? - làm thế nào để bạn tìm thấy phương thức của lớp cha trong python?

shim

8,57910 Huy hiệu vàng72 Huy hiệu bạc103 Huy hiệu Đồng10 gold badges72 silver badges103 bronze badges

Đã trả lời ngày 31 tháng 8 năm 2018 lúc 13:39Aug 31, 2018 at 13:39

1

Đây là một phương pháp trừu tượng hơn:

class Foo(Bar):
    def baz(self, **kwargs):
        return super().baz(**kwargs)
8

Đã trả lời ngày 20 tháng 6 năm 2011 lúc 5:32Jun 20, 2011 at 5:32

3

Làm thế nào để bạn tìm thấy lớp cha mẹ của một lớp học trong Python?

Python IssubClass () là chức năng tích hợp được sử dụng để kiểm tra xem một lớp có phải là lớp con của lớp khác hay không. Hàm này trả về true nếu lớp đã cho là lớp con của lớp đã cho khác, nó trả về sai. is built-in function used to check if a class is a subclass of another class or not. This function returns True if the given class is the subclass of given class else it returns False.

Python lớp phụ huynh là gì?

Lớp cha là lớp được kế thừa, còn được gọi là lớp cơ sở.Lớp con là lớp kế thừa từ một lớp khác, còn được gọi là lớp dẫn xuất.the class being inherited from, also called base class. Child class is the class that inherits from another class, also called derived class.

Làm thế nào để bạn có được các biến cha mẹ trong Python?

Điều này thực sự đơn giản, bạn chỉ cần gọi hàm tạo của lớp cha trong hàm tạo của lớp con và sau đó đối tượng của lớp con có thể truy cập các phương thức và thuộc tính của lớp cha.call the constructor of parent class inside the constructor of child class and then the object of a child class can access the methods and attributes of the parent class.

Làm thế nào để bạn truy cập các phương thức lớp cha trong lớp con?

Sử dụng từ khóa siêu để truy cập phương thức lớp cha bằng cách khác, từ khóa siêu được sử dụng nếu phương thức bị ghi đè.Bạn ghi đè một phương thức trong lớp cha bằng cách gọi cùng một phương thức trong lớp con.Quá trình này được gọi là phương thức ghi đè. In other words, the super keyword is used if the method is overridden. You override a method in the parent class by calling the same method in the child class. This process is known as method overriding.