Phương pháp này sẽ rất hữu ích, vì bạn có thể sử dụng các đối tượng của cả hai lớp có thể thay thế cho nhau. Có một vấn đề nghiêm trọng với điều này, tôi sẽ giải thích rằng cuối cùng.
class A:
def MethodA[self]:
return "Inside MethodA"
def __init__ [self, Friend=None]:
self.__dict__['a'] = "I am a"
self.__dict__['Friend'] = Friend
if Friend is not None: self.__dict__['Friend'].__dict__['Friend'] = self
def __getattr__[self, name]:
if self.Friend is not None: return getattr[self.Friend, name]
raise AttributeError ["Unknown Attribute `" + name + "`"]
def __setattr__[self, name, value]:
if self.Friend is not None: setattr[self.Friend, name, value]
raise AttributeError ["Unknown Attribute `" + name + "`"]
class B:
def MethodB[self]:
return "Inside MethodB"
def __init__ [self, Friend=None]:
self.__dict__['b'] = "I am b"
self.__dict__['Friend'] = Friend
if Friend is not None: self.__dict__['Friend'].__dict__['Friend'] = self
def __getattr__[self, name]:
if self.Friend is not None: return getattr[self.Friend, name]
raise AttributeError ["Unknown Attribute `" + name + "`"]
def __setattr__[self, name, value]:
if self.Friend is not None: setattr[self.Friend, name, value]
raise AttributeError ["Unknown Attribute `" + name + "`"]
Explanation:
Theo trang này, __getattr__
và __setattr__
sẽ được gọi trên các đối tượng Python chỉ khi thuộc tính được yêu cầu không được tìm thấy trong không gian của đối tượng cụ thể. Vì vậy, trong hàm tạo, chúng tôi đang thiết lập mối quan hệ giữa cả hai lớp. Và sau đó bất cứ khi nào __getattr__
hoặc __setattr__
được gọi, chúng tôi tham khảo đối tượng khác bằng phương thức getattr
. .
Chạy mẫu:
b = B[]
# print b.a # Throws AttributeError, as A and B are not related yet
a = A[b]
print a.a
print a.b
print b.a # Works fine here, as 'a' is not found b, returns A's a
print b.b
print a.MethodA[]
print a.MethodB[]
print b.MethodA[]
print b.MethodB[]
I am a
I am b
I am a
I am b
Inside MethodA
Inside MethodB
Inside MethodA
Inside MethodB
Bây giờ, vấn đề nghiêm trọng:
Nếu chúng ta cố gắng truy cập một thuộc tính không có trong cả hai đối tượng này, chúng ta sẽ kết thúc trong đệ quy vô hạn. Giả sử tôi muốn truy cập 'C' từ 'A'. Vì C không nằm trong A, nó sẽ gọi __getattr__
và nó sẽ giới thiệu đối tượng B. Vì đối tượng B không có C, nó sẽ gọi __getattr__
sẽ giới thiệu đối tượng a. Vì vậy, chúng tôi kết thúc trong một đệ quy vô hạn. Vì vậy, cách tiếp cận này hoạt động tốt, khi bạn không truy cập bất cứ điều gì mà cả hai đối tượng không biết.
Xem thảo luận
Cải thiện bài viết
Lưu bài viết
Xem thảo luận
Cải thiện bài viết
Lưu bài viết
Đọc
Attributes of a class can also be accessed using the following built-in methods and functions :
- Bàn luận This function is used to access the attribute of object.
- Các thuộc tính của một lớp là các đối tượng hàm xác định các phương thức tương ứng của các trường hợp của nó. Chúng được sử dụng để thực hiện các điều khiển truy cập của các lớp.Attribution của một lớp cũng có thể được truy cập bằng các phương thức và chức năng tích hợp sau: This function is used to check if an attribute exist or not.
- getAttr [] - Hàm này được sử dụng để truy cập thuộc tính của đối tượng. This function is used to set an attribute. If the attribute does not exist, then it would be created.
- HasAttr [] - Hàm này được sử dụng để kiểm tra xem thuộc tính có tồn tại hay không. This function is used to delete an attribute. If you are accessing the attribute after deleting it raises error “class has no attribute”.
setAttr [] - Hàm này được sử dụng để đặt thuộc tính. Nếu thuộc tính không tồn tại, thì nó sẽ được tạo ra.
delattr [] - Hàm này được sử dụng để xóa một thuộc tính. Nếu bạn đang truy cập thuộc tính sau khi xóa, nó sẽ tăng lỗi, lớp không có thuộc tính nào.
b = B[]
# print b.a # Throws AttributeError, as A and B are not related yet
a = A[b]
print a.a
print a.b
print b.a # Works fine here, as 'a' is not found b, returns A's a
print b.b
print a.MethodA[]
print a.MethodB[]
print b.MethodA[]
print b.MethodB[]
I am a
I am b
I am a
I am b
Inside MethodA
Inside MethodB
Inside MethodA
Inside MethodB
7b = B[]
# print b.a # Throws AttributeError, as A and B are not related yet
a = A[b]
print a.a
print a.b
print b.a # Works fine here, as 'a' is not found b, returns A's a
print b.b
print a.MethodA[]
print a.MethodB[]
print b.MethodA[]
print b.MethodB[]
I am a
I am b
I am a
I am b
Inside MethodA
Inside MethodB
Inside MethodA
Inside MethodB
8b = B[]
# print b.a # Throws AttributeError, as A and B are not related yet
a = A[b]
print a.a
print a.b
print b.a # Works fine here, as 'a' is not found b, returns A's a
print b.b
print a.MethodA[]
print a.MethodB[]
print b.MethodA[]
print b.MethodB[]
I am a
I am b
I am a
I am b
Inside MethodA
Inside MethodB
Inside MethodA
Inside MethodB
9Harsh True 1520
b = B[]
# print b.a # Throws AttributeError, as A and B are not related yet
a = A[b]
print a.a
print a.b
print b.a # Works fine here, as 'a' is not found b, returns A's a
print b.b
print a.MethodA[]
print a.MethodB[]
print b.MethodA[]
print b.MethodB[]
I am a
I am b
I am a
I am b
Inside MethodA
Inside MethodB
Inside MethodA
Inside MethodB
7Harsh True 1522
b = B[]
# print b.a # Throws AttributeError, as A and B are not related yet
a = A[b]
print a.a
print a.b
print b.a # Works fine here, as 'a' is not found b, returns A's a
print b.b
print a.MethodA[]
print a.MethodB[]
print b.MethodA[]
print b.MethodB[]
I am a
I am b
I am a
I am b
Inside MethodA
Inside MethodB
Inside MethodA
Inside MethodB
9Harsh True 1524
Các phương pháp sau được giải thích với ví dụ được đưa ra dưới đây:
b = B[]
# print b.a # Throws AttributeError, as A and B are not related yet
a = A[b]
print a.a
print a.b
print b.a # Works fine here, as 'a' is not found b, returns A's a
print b.b
print a.MethodA[]
print a.MethodB[]
print b.MethodA[]
print b.MethodB[]
I am a
I am b
I am a
I am b
Inside MethodA
Inside MethodB
Inside MethodA
Inside MethodB
5 b = B[]
# print b.a # Throws AttributeError, as A and B are not related yet
a = A[b]
print a.a
print a.b
print b.a # Works fine here, as 'a' is not found b, returns A's a
print b.b
print a.MethodA[]
print a.MethodB[]
print b.MethodA[]
print b.MethodB[]
I am a
I am b
I am a
I am b
Inside MethodA
Inside MethodB
Inside MethodA
Inside MethodB
6b = B[]
# print b.a # Throws AttributeError, as A and B are not related yet
a = A[b]
print a.a
print a.b
print b.a # Works fine here, as 'a' is not found b, returns A's a
print b.b
print a.MethodA[]
print a.MethodB[]
print b.MethodA[]
print b.MethodB[]
I am a
I am b
I am a
I am b
Inside MethodA
Inside MethodB
Inside MethodA
Inside MethodB
7Harsh True 1526
Harsh True 1527
Harsh True 1528
Harsh True 1529
4 9 90
4 9 91
4 9 92
Harsh True 1528
4 9 94
4 9 90
4 9 91
4 9 92
Harsh True 1528
4 9 99
3 3 20
b = B[]
# print b.a # Throws AttributeError, as A and B are not related yet
a = A[b]
print a.a
print a.b
print b.a # Works fine here, as 'a' is not found b, returns A's a
print b.b
print a.MethodA[]
print a.MethodB[]
print b.MethodA[]
print b.MethodB[]
I am a
I am b
I am a
I am b
Inside MethodA
Inside MethodB
Inside MethodA
Inside MethodB
9 3 3 22
__getattr__
5
3 3 26
__getattr__
7__getattr__
8__getattr__
9__setattr__
04 9 91
4 9 92
getattr
3 3 26
3 3 27
3 3 28
__setattr__
7__setattr__
8__setattr__
9__setattr__
0
4 9 91
4 9 92
__getattr__
13 3 26
3 3 27
3 3 28
Harsh True 152
4
9
9
1 4
9
9
2getattr
3
3
2
6__getattr__
73
3
2
8A static method is a method[member function] that don’t use argument self at all. To declare a static method, proceed it with the statement “@staticmethod”.
Đầu ra:
b = B[]
# print b.a # Throws AttributeError, as A and B are not related yet
a = A[b]
print a.a
print a.b
print b.a # Works fine here, as 'a' is not found b, returns A's a
print b.b
print a.MethodA[]
print a.MethodB[]
print b.MethodA[]
print b.MethodB[]
I am a
I am b
I am a
I am b
Inside MethodA
Inside MethodB
Inside MethodA
Inside MethodB
7__getattr__
4Phương pháp tĩnh: Phương pháp tĩnh là một phương thức [hàm thành viên] không sử dụng đối số tự. Để khai báo một phương thức tĩnh, hãy tiến hành câu lệnh của câu lệnh @staticmethod.
b = B[]
# print b.a # Throws AttributeError, as A and B are not related yet
a = A[b]
print a.a
print a.b
print b.a # Works fine here, as 'a' is not found b, returns A's a
print b.b
print a.MethodA[]
print a.MethodB[]
print b.MethodA[]
print b.MethodB[]
I am a
I am b
I am a
I am b
Inside MethodA
Inside MethodB
Inside MethodA
Inside MethodB
5 __getattr__
2__setattr__
4
b = B[]
# print b.a # Throws AttributeError, as A and B are not related yet
a = A[b]
print a.a
print a.b
print b.a # Works fine here, as 'a' is not found b, returns A's a
print b.b
print a.MethodA[]
print a.MethodB[]
print b.MethodA[]
print b.MethodB[]
I am a
I am b
I am a
I am b
Inside MethodA
Inside MethodB
Inside MethodA
Inside MethodB
9__setattr__
6b = B[]
# print b.a # Throws AttributeError, as A and B are not related yet
a = A[b]
print a.a
print a.b
print b.a # Works fine here, as 'a' is not found b, returns A's a
print b.b
print a.MethodA[]
print a.MethodB[]
print b.MethodA[]
print b.MethodB[]
I am a
I am b
I am a
I am b
Inside MethodA
Inside MethodB
Inside MethodA
Inside MethodB
7Harsh True 1526
__getattr__
7getattr
0getattr
1__setattr__
0
4 9 90__79
b = B[]
# print b.a # Throws AttributeError, as A and B are not related yet
a = A[b]
print a.a
print a.b
print b.a # Works fine here, as 'a' is not found b, returns A's a
print b.b
print a.MethodA[]
print a.MethodB[]
print b.MethodA[]
print b.MethodB[]
I am a
I am b
I am a
I am b
Inside MethodA
Inside MethodB
Inside MethodA
Inside MethodB
9 __setattr__
1__setattr__
2__setattr__
3getattr
5getattr
6__setattr__
0
__setattr__
7
b = B[]
# print b.a # Throws AttributeError, as A and B are not related yet
a = A[b]
print a.a
print a.b
print b.a # Works fine here, as 'a' is not found b, returns A's a
print b.b
print a.MethodA[]
print a.MethodB[]
print b.MethodA[]
print b.MethodB[]
I am a
I am b
I am a
I am b
Inside MethodA
Inside MethodB
Inside MethodA
Inside MethodB
9 __setattr__
64 9 90__79
b = B[]
# print b.a # Throws AttributeError, as A and B are not related yet
a = A[b]
print a.a
print a.b
print b.a # Works fine here, as 'a' is not found b, returns A's a
print b.b
print a.MethodA[]
print a.MethodB[]
print b.MethodA[]
print b.MethodB[]
I am a
I am b
I am a
I am b
Inside MethodA
Inside MethodB
Inside MethodA
Inside MethodB
9 __setattr__
1__setattr__
2__setattr__
34 9 91
4 9 92
__getattr__
13 3 26
3 3 27
3 3 28
4 9 9
4
9
9
1 4
9
9
2getattr
3
3
2
6__getattr__
73
3
2
8
Đầu ra:
Explained with the example given below :
Phương pháp tĩnh: Phương pháp tĩnh là một phương thức [hàm thành viên] không sử dụng đối số tự. Để khai báo một phương thức tĩnh, hãy tiến hành câu lệnh của câu lệnh @staticmethod.
b = B[]
# print b.a # Throws AttributeError, as A and B are not related yet
a = A[b]
print a.a
print a.b
print b.a # Works fine here, as 'a' is not found b, returns A's a
print b.b
print a.MethodA[]
print a.MethodB[]
print b.MethodA[]
print b.MethodB[]
I am a
I am b
I am a
I am b
Inside MethodA
Inside MethodB
Inside MethodA
Inside MethodB
5 __getattr__
2b = B[]
# print b.a # Throws AttributeError, as A and B are not related yet
a = A[b]
print a.a
print a.b
print b.a # Works fine here, as 'a' is not found b, returns A's a
print b.b
print a.MethodA[]
print a.MethodB[]
print b.MethodA[]
print b.MethodB[]
I am a
I am b
I am a
I am b
Inside MethodA
Inside MethodB
Inside MethodA
Inside MethodB
7Harsh True 1526
__getattr__
74 9 90__79
b = B[]
# print b.a # Throws AttributeError, as A and B are not related yet
a = A[b]
print a.a
print a.b
print b.a # Works fine here, as 'a' is not found b, returns A's a
print b.b
print a.MethodA[]
print a.MethodB[]
print b.MethodA[]
print b.MethodB[]
I am a
I am b
I am a
I am b
Inside MethodA
Inside MethodB
Inside MethodA
Inside MethodB
9 __setattr__
1__setattr__
2__setattr__
3__setattr__
7
b = B[]
# print b.a # Throws AttributeError, as A and B are not related yet
a = A[b]
print a.a
print a.b
print b.a # Works fine here, as 'a' is not found b, returns A's a
print b.b
print a.MethodA[]
print a.MethodB[]
print b.MethodA[]
print b.MethodB[]
I am a
I am b
I am a
I am b
Inside MethodA
Inside MethodB
Inside MethodA
Inside MethodB
9 __setattr__
64 9 91
getattr
44 9 91
getattr
9Truy cập các thuộc tính và phương thức của một lớp trong một lớp khác
Truy cập các thuộc tính và phương thức của một lớp trong một lớp khác được thực hiện bằng cách chuyển đối tượng của một lớp sang một lớp khác. Giải thích bằng ví dụ được đưa ra dưới đây:
b = B[]
# print b.a # Throws AttributeError, as A and B are not related yet
a = A[b]
print a.a
print a.b
print b.a # Works fine here, as 'a' is not found b, returns A's a
print b.b
print a.MethodA[]
print a.MethodB[]
print b.MethodA[]
print b.MethodB[]
I am a
I am b
I am a
I am b
Inside MethodA
Inside MethodB
Inside MethodA
Inside MethodB
5 b = B[]
# print b.a # Throws AttributeError, as A and B are not related yet
a = A[b]
print a.a
print a.b
print b.a # Works fine here, as 'a' is not found b, returns A's a
print b.b
print a.MethodA[]
print a.MethodB[]
print b.MethodA[]
print b.MethodB[]
I am a
I am b
I am a
I am b
Inside MethodA
Inside MethodB
Inside MethodA
Inside MethodB
03b = B[]
# print b.a # Throws AttributeError, as A and B are not related yet
a = A[b]
print a.a
print a.b
print b.a # Works fine here, as 'a' is not found b, returns A's a
print b.b
print a.MethodA[]
print a.MethodB[]
print b.MethodA[]
print b.MethodB[]
I am a
I am b
I am a
I am b
Inside MethodA
Inside MethodB
Inside MethodA
Inside MethodB
7Harsh True 1526
b = B[]
# print b.a # Throws AttributeError, as A and B are not related yet
a = A[b]
print a.a
print a.b
print b.a # Works fine here, as 'a' is not found b, returns A's a
print b.b
print a.MethodA[]
print a.MethodB[]
print b.MethodA[]
print b.MethodB[]
I am a
I am b
I am a
I am b
Inside MethodA
Inside MethodB
Inside MethodA
Inside MethodB
06Harsh True 1528
Harsh True 1529
4 9 90
Harsh True 1528
b = B[]
# print b.a # Throws AttributeError, as A and B are not related yet
a = A[b]
print a.a
print a.b
print b.a # Works fine here, as 'a' is not found b, returns A's a
print b.b
print a.MethodA[]
print a.MethodB[]
print b.MethodA[]
print b.MethodB[]
I am a
I am b
I am a
I am b
Inside MethodA
Inside MethodB
Inside MethodA
Inside MethodB
11b = B[]
# print b.a # Throws AttributeError, as A and B are not related yet
a = A[b]
print a.a
print a.b
print b.a # Works fine here, as 'a' is not found b, returns A's a
print b.b
print a.MethodA[]
print a.MethodB[]
print b.MethodA[]
print b.MethodB[]
I am a
I am b
I am a
I am b
Inside MethodA
Inside MethodB
Inside MethodA
Inside MethodB
9 b = B[]
# print b.a # Throws AttributeError, as A and B are not related yet
a = A[b]
print a.a
print a.b
print b.a # Works fine here, as 'a' is not found b, returns A's a
print b.b
print a.MethodA[]
print a.MethodB[]
print b.MethodA[]
print b.MethodB[]
I am a
I am b
I am a
I am b
Inside MethodA
Inside MethodB
Inside MethodA
Inside MethodB
134 9 90
Harsh True 1528
b = B[]
# print b.a # Throws AttributeError, as A and B are not related yet
a = A[b]
print a.a
print a.b
print b.a # Works fine here, as 'a' is not found b, returns A's a
print b.b
print a.MethodA[]
print a.MethodB[]
print b.MethodA[]
print b.MethodB[]
I am a
I am b
I am a
I am b
Inside MethodA
Inside MethodB
Inside MethodA
Inside MethodB
16b = B[]
# print b.a # Throws AttributeError, as A and B are not related yet
a = A[b]
print a.a
print a.b
print b.a # Works fine here, as 'a' is not found b, returns A's a
print b.b
print a.MethodA[]
print a.MethodB[]
print b.MethodA[]
print b.MethodB[]
I am a
I am b
I am a
I am b
Inside MethodA
Inside MethodB
Inside MethodA
Inside MethodB
9 getattr
1b = B[]
# print b.a # Throws AttributeError, as A and B are not related yet
a = A[b]
print a.a
print a.b
print b.a # Works fine here, as 'a' is not found b, returns A's a
print b.b
print a.MethodA[]
print a.MethodB[]
print b.MethodA[]
print b.MethodB[]
I am a
I am b
I am a
I am b
Inside MethodA
Inside MethodB
Inside MethodA
Inside MethodB
7Harsh True 1526
b = B[]
# print b.a # Throws AttributeError, as A and B are not related yet
a = A[b]
print a.a
print a.b
print b.a # Works fine here, as 'a' is not found b, returns A's a
print b.b
print a.MethodA[]
print a.MethodB[]
print b.MethodA[]
print b.MethodB[]
I am a
I am b
I am a
I am b
Inside MethodA
Inside MethodB
Inside MethodA
Inside MethodB
21Harsh True 1528
Harsh True 1529
Các
4 9 91
b = B[]
# print b.a # Throws AttributeError, as A and B are not related yet
a = A[b]
print a.a
print a.b
print b.a # Works fine here, as 'a' is not found b, returns A's a
print b.b
print a.MethodA[]
print a.MethodB[]
print b.MethodA[]
print b.MethodB[]
I am a
I am b
I am a
I am b
Inside MethodA
Inside MethodB
Inside MethodA
Inside MethodB
664 9 90
b = B[]
# print b.a # Throws AttributeError, as A and B are not related yet
a = A[b]
print a.a
print a.b
print b.a # Works fine here, as 'a' is not found b, returns A's a
print b.b
print a.MethodA[]
print a.MethodB[]
print b.MethodA[]
print b.MethodB[]
I am a
I am b
I am a
I am b
Inside MethodA
Inside MethodB
Inside MethodA
Inside MethodB
34 Harsh True 1528
b = B[]
# print b.a # Throws AttributeError, as A and B are not related yet
a = A[b]
print a.a
print a.b
print b.a # Works fine here, as 'a' is not found b, returns A's a
print b.b
print a.MethodA[]
print a.MethodB[]
print b.MethodA[]
print b.MethodB[]
I am a
I am b
I am a
I am b
Inside MethodA
Inside MethodB
Inside MethodA
Inside MethodB
364 9 91
4 9 92
__getattr__
13 3 26
3 3 27
3 3 28
3 3 2