Hướng dẫn python inheritance attribute error - lỗi thuộc tính kế thừa python

1

Mới! Lưu câu hỏi hoặc câu trả lời và sắp xếp nội dung yêu thích của bạn. Tìm hiểu thêm.
Learn more.

  1. Tôi chưa quen với kế thừa Python và tôi đã gặp một vấn đề đơn giản chỉ để in ra các biến.
  2. Tôi có một bản in lớp phụ huynh
class prints:
   def __init__(self):
       self.__name = ""
   def getName(self):
       return self.__name

class A(prints):
   def __init__(self):
       self.__name = "A"

a = A()
n = a.getName()

print(n)

Tôi gặp lỗi

 AttributeError: 'A' object has no attribute '_prints__name'
  • Tôi biết tôi có thể làm điều đó trong C ++, nhưng tôi đang gãi đầu để tìm ra nơi sai trong mã Python của tôi ..

Ai đó có thể giúp đỡ? Cảm ơn!

Hướng dẫn python inheritance attribute error - lỗi thuộc tính kế thừa python

Khi được hỏi ngày 26 tháng 5 năm 2020 lúc 23:06May 26, 2020 at 23:06

Hướng dẫn python inheritance attribute error - lỗi thuộc tính kế thừa python

Python không thực hiện các biến riêng tư nhưng nó giúp giảm nguy cơ đụng độ tên với các biến bạn muốn giữ riêng tư cho một lớp. Nếu biến thể hiện của bạn bắt đầu với hai dấu gạch dưới, Python sẽ dành cho tên lớp. Xem "Tên Mangling" trong các biến riêng tư, biến

class prints:
   def __init__(self):
       self.__name = ""
   def getName(self):
       return self.__name

class A(prints):
   def __init__(self):
       self._prints__name = "A"

a = A()
n = a.getName()

print(n)
0
class prints:
   def __init__(self):
       self.__name = ""
   def getName(self):
       return self.__name

class A(prints):
   def __init__(self):
       self._prints__name = "A"

a = A()
n = a.getName()

print(n)
1 được đổi tên thành
class prints:
   def __init__(self):
       self.__name = ""
   def getName(self):
       return self.__name

class A(prints):
   def __init__(self):
       self._prints__name = "A"

a = A()
n = a.getName()

print(n)
2.

Phương pháp này hoạt động, ngoại trừ khi nó không. Các lớp kế thừa không có cách tự nhiên để đi đến biến. Nói chung, đây không phải là một vấn đề vì nó là lớp riêng tư. Một cách để sử dụng nó là gọi các phương thức trong lớp cơ sở. Trong trường hợp này, bạn có thể nên gọi lớp cơ sở

class prints:
   def __init__(self):
       self.__name = ""
   def getName(self):
       return self.__name

class A(prints):
   def __init__(self):
       self._prints__name = "A"

a = A()
n = a.getName()

print(n)
3 để đặt biến. Nhưng nếu bạn muốn sử dụng nó trực tiếp, bạn có thể làm
class prints:
   def __init__(self):
       self.__name = ""
   def getName(self):
       return self.__name

class A(prints):
   def __init__(self):
       self._prints__name = "A"

a = A()
n = a.getName()

print(n)
4.

class prints:
   def __init__(self):
       self.__name = ""
   def getName(self):
       return self.__name

class A(prints):
   def __init__(self):
       self._prints__name = "A"

a = A()
n = a.getName()

print(n)

Đã trả lời ngày 26 tháng 5 năm 2020 lúc 23:19May 26, 2020 at 23:19

tdelaneytdelaneytdelaney

66,8K5 Huy hiệu vàng74 Huy hiệu bạc106 Huy hiệu đồng5 gold badges74 silver badges106 bronze badges

1

Vấn đề là bạn đang sử dụng một biến với tiền tố

class prints:
   def __init__(self):
       self.__name = ""
   def getName(self):
       return self.__name

class A(prints):
   def __init__(self):
       self._prints__name = "A"

a = A()
n = a.getName()

print(n)
5. Chính thức Python không có các biến riêng tư, nhưng khi bạn sử dụng VAR với tiền tố
class prints:
   def __init__(self):
       self.__name = ""
   def getName(self):
       return self.__name

class A(prints):
   def __init__(self):
       self._prints__name = "A"

a = A()
n = a.getName()

print(n)
5, nó được lưu trữ là
class prints:
   def __init__(self):
       self.__name = ""
   def getName(self):
       return self.__name

class A(prints):
   def __init__(self):
       self._prints__name = "A"

a = A()
n = a.getName()

print(n)
7,

Nếu bạn nhìn trộm bên trong

class prints:
   def __init__(self):
       self.__name = ""
   def getName(self):
       return self.__name

class A(prints):
   def __init__(self):
       self._prints__name = "A"

a = A()
n = a.getName()

print(n)
8:

a.__dict__
Out[9]: {'_A__name': 'A'}

Vì vậy, khi bạn thực hiện

class prints:
   def __init__(self):
       self.__name = ""
   def getName(self):
       return self.__name

class A(prints):
   def __init__(self):
       self._prints__name = "A"

a = A()
n = a.getName()

print(n)
9, logic kế thừa mà bạn sẽ mong đợi những cú đá vào đó cha mẹ tìm kiếm cho
a.__dict__
Out[9]: {'_A__name': 'A'}
0 bằng cách xem ________ 31 (tìm thấy một trận đấu)

Điều này sẽ cố gắng giải quyết

class prints:
   def __init__(self):
       self.__name = ""
   def getName(self):
       return self.__name

class A(prints):
   def __init__(self):
       self._prints__name = "A"

a = A()
n = a.getName()

print(n)
1 của cha mẹ, ngoại trừ trong trường hợp này, nó sẽ tìm cách giải quyết nó dưới dạng
class prints:
   def __init__(self):
       self.__name = ""
   def getName(self):
       return self.__name

class A(prints):
   def __init__(self):
       self._prints__name = "A"

a = A()
n = a.getName()

print(n)
2 của
a.__dict__
Out[9]: {'_A__name': 'A'}
4 là một ví dụ của
a.__dict__
Out[9]: {'_A__name': 'A'}
5.

Đây được gọi là tên Mangling

Đã trả lời ngày 26 tháng 5 năm 2020 lúc 23:31May 26, 2020 at 23:31

Hướng dẫn python inheritance attribute error - lỗi thuộc tính kế thừa python

SvissvisSVIS

481 Huy hiệu bạc11 Huy hiệu đồng1 silver badge11 bronze badges

1

class prints:
   def __init__(self, name):
       self.name = ""

   def getName(self):
       return self.name

class A(prints):
   def __init__(self):
       self.name = "A"

 a = A()
 n = a.getName()

print(n)

Tham khảo những điều cơ bản trong Python https://www.w3schools.com/python/python_inheritance.asp

Đã trả lời ngày 27 tháng 5 năm 2020 lúc 2:04May 27, 2020 at 2:04

CodeEmpowerCodeEmpowerCodeEmpower

62511 Huy hiệu bạc29 Huy hiệu đồng11 silver badges29 bronze badges

Lớp con của bạn nên là:

class TypeTwoEvent(Event):

   def __init__(self, level = None, * args, ** kwargs):
   super().__init__( * args, ** kwargs)
self.sr1 = level
self.state = STATE_EVENT_TWO

Hãy nhớ rằng,

class prints:
   def __init__(self):
       self.__name = ""
   def getName(self):
       return self.__name

class A(prints):
   def __init__(self):
       self._prints__name = "A"

a = A()
n = a.getName()

print(n)
3 không phải là một phương pháp đặc biệt để loại bỏ cái tên kỳ lạ của nó. Nó chỉ là phương thức được gọi tự động sau khi đối tượng được tạo. Mặt khác, đó là một phương pháp thông thường và các quy tắc kế thừa thông thường được áp dụng.

super().__init__(arguments, that, goes, to, parents)

Bạn đang ghi đè hàm tạo (

class prints:
   def __init__(self):
       self.__name = ""
   def getName(self):
       return self.__name

class A(prints):
   def __init__(self):
       self._prints__name = "A"

a = A()
n = a.getName()

print(n)
3) của lớp cha. Để mở rộng nó, bạn cần gọi rõ ràng hàm tạo của cha mẹ bằng một cuộc gọi
a.__dict__
Out[9]: {'_A__name': 'A'}
8.

class TypeTwoEvent(Event):
   def __init__(self, level = None, ** kwargs):
   # the super call to set the attributes in the parent class
super().__init__( ** kwargs)
# now, extend other attributes
self.sr1 = level
self.state = STATE_EVENT_TWO


Gợi ý: 2

Kế thừa là một khái niệm lập trình hướng đối tượng trong đó một lớp (thường được gọi là lớp con) có được các thuộc tính và hành vi từ một lớp khác (thường được gọi là lớp cha). được gọi là thừa kế đơn. Tất cả các đoạn mã trước sử dụng kế thừa duy nhất., Điều này giúp loại bỏ sự cần thiết phải thực hiện các phương thức được kế thừa bởi một lớp con hoặc lớp con, một lần nữa. Nói cách khác, nó cho phép một lớp con thừa hưởng/tái sử dụng các thuộc tính và phương thức của lớp cha. Về mặt đối tượng trong thế giới thực, nó thể hiện mối quan hệ IS-A., Khi các biến thể hiện của lớp cha không cần phải được thừa hưởng bởi lớp con, chúng có thể không có sẵn cho lớp con bằng cách thêm dấu gạch dưới đôi ( __) Trước tên biến. Điều này bổ sung _ classname trước tên biến. Vì vậy, khi chúng tôi cố gắng truy cập nó giống như các biến thể hiện khác của lớp, nó sẽ đưa ra một lỗi thuộc tính của Google.

Điều này giúp loại bỏ sự cần thiết phải thực hiện các phương pháp được kế thừa bởi một lớp con hoặc lớp con một lần nữa. Nói cách khác, nó cho phép một lớp con thừa hưởng/tái sử dụng các thuộc tính và phương thức của lớp cha. Về mặt đối tượng trong thế giới thực, nó đại diện cho một mối quan hệ IS-A.

# Base / super / parent classclass ProgramLanguage: def __init__(self, name): self.name = name
# Derived / sub / child classclass Python(ProgramLanguage): pass
# Create an object of the derived classy = Python("Inheritance")
print(y.name) # Output: Inheritance

2._

________số 8

Trong ví dụ dưới đây, lớp dẫn xuất,

a.__dict__
Out[9]: {'_A__name': 'A'}
9, thực hiện phương thức phụ huynh
class prints:
   def __init__(self, name):
       self.name = ""

   def getName(self):
       return self.name

class A(prints):
   def __init__(self):
       self.name = "A"

 a = A()
 n = a.getName()

print(n)
0 bên trong định nghĩa
class prints:
   def __init__(self, name):
       self.name = ""

   def getName(self):
       return self.name

class A(prints):
   def __init__(self):
       self.name = "A"

 a = A()
 n = a.getName()

print(n)
1:

 AttributeError: 'A' object has no attribute '_prints__name'
0

# Base / super / parent classclass ProgramLanguage: def __init__(self, name): self.name = name
# Derived / sub / child classclass Python(ProgramLanguage): pass
# Create an object of the derived classy = Python("Inheritance")
print(y.name) # Output: Inheritance

 AttributeError: 'A' object has no attribute '_prints__name'
0

 AttributeError: 'A' object has no attribute '_prints__name'
3

 AttributeError: 'A' object has no attribute '_prints__name'
4

 AttributeError: 'A' object has no attribute '_prints__name'
5


Gợi ý: 3

Lớp cơ sở cho tất cả các trường hợp ngoại lệ tích hợp. Nó không có nghĩa là được kế thừa trực tiếp bởi các lớp do người dùng xác định (đối với đó, sử dụng ngoại lệ). Nếu str () được gọi trên một thể hiện của lớp này, thì biểu diễn của (các) đối số cho trường hợp được trả về hoặc chuỗi trống khi không có đối số. ngoại lệ; Các lập trình viên được khuyến khích rút ra các ngoại lệ mới từ lớp ngoại lệ hoặc một trong các lớp con của nó chứ không phải từ Baseexception. Thông tin thêm về việc xác định các ngoại lệ có sẵn trong hướng dẫn Python theo các trường hợp ngoại lệ do người dùng xác định., Tất cả các trường hợp ngoại lệ được tích hợp, không phải là hệ thống được lấy từ lớp này. Tất cả các trường hợp ngoại lệ do người dùng xác định cũng nên được lấy từ lớp này., Ngoại lệ này có nguồn gốc từ RunTimeError. Trong các lớp cơ sở do người dùng xác định, các phương thức trừu tượng sẽ nâng cao ngoại lệ này khi chúng yêu cầu các lớp dẫn xuất để ghi đè phương thức hoặc trong khi lớp đang được phát triển để chỉ ra rằng việc triển khai thực sự vẫn cần được thêm vào.

 AttributeError: 'A' object has no attribute '_prints__name'
6

 AttributeError: 'A' object has no attribute '_prints__name'
7

 AttributeError: 'A' object has no attribute '_prints__name'
8


Gợi ý: 4

Cập nhật lần cuối: 07 tháng 7, 2022

Cú pháp kế thừa Python

 AttributeError: 'A' object has no attribute '_prints__name'
9