5
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.
Trong Python, một đối tượng có thể có một đối tượng khác như một thuộc tính không? Ví dụ, một lớp có tên CAR có thể có một lớp gọi là Tyre là một thuộc tính không?
Decio lira
1.8211 huy hiệu vàng18 Huy hiệu bạc24 Huy hiệu đồng1 gold badge18 silver badges24 bronze badges
Khi được hỏi ngày 24 tháng 5 năm 2010 lúc 22:40May 24, 2010 at 22:40
1
Bạn có nghĩa là lớp tire hoặc một thể hiện của lớp tire? Nó có thể có cả hai mặc dù cái sau có lẽ hữu ích hơn. Nếu bạn đang tìm kiếm một đối tượng của lớp >>> class tire: ... pass ... >>> class car: ... def __init__(self, tire): ... self.tire = tire ... >>> t = tire() >>> t.brand = 'Goodyear' >>> c = car(t) >>> c.tire.brand 'Goodyear' 1 để có-một đối tượng của loại >>> class tire: ... pass ... >>> class car: ... def __init__(self, tire): ... self.tire = tire ... >>> t = tire() >>> t.brand = 'Goodyear' >>> c = car(t) >>> c.tire.brand 'Goodyear' 2, bạn sẽ muốn loại bài tập >>> class tire: ... pass ... >>> class car: ... def __init__(self, tire): ... self.tire = tire ... >>> t = tire() >>> t.brand = 'Goodyear' >>> c = car(t) >>> c.tire.brand 'Goodyear' 3:object of class >>> class tire: ... pass ... >>> class car: ... def __init__(self, tire): ... self.tire = tire ... >>> t = tire() >>> t.brand = 'Goodyear' >>> c = car(t) >>> c.tire.brand 'Goodyear' 1 to has-a object of type >>> class tire: ... pass ... >>> class car: ... def __init__(self, tire): ... self.tire = tire ... >>> t = tire() >>> t.brand = 'Goodyear' >>> c = car(t) >>> c.tire.brand 'Goodyear' 2 you'd want the >>> class tire: ... pass ... >>> class car: ... def __init__(self, tire): ... self.tire = tire ... >>> t = tire() >>> t.brand = 'Goodyear' >>> c = car(t) >>> c.tire.brand 'Goodyear' 3 variety of assignment:
Python 2.6.5 (r265:79063, Apr 16 2010, 13:09:56) >>> class Fred(object): pass ... >>> class Mary(object): ... def __init__(self): ... self.classref = Fred ... self.classinst = Fred() ... >>> x = Mary() >>> dir(x) [... 'classinst', 'classref'] >>> x.classref <class '__main__.Fred'> >>> x.classinst <__main__.Fred object at 0xb76eed0c>Đã trả lời ngày 24 tháng 5 năm 2010 lúc 22:50May 24, 2010 at 22:50
MSWMSWmsw
42K9 Huy hiệu vàng84 Huy hiệu bạc 109 Huy hiệu đồng9 gold badges84 silver badges109 bronze badges
Yes.
>>> class tire: ... pass ... >>> class car: ... def __init__(self, tire): ... self.tire = tire ... >>> t = tire() >>> t.brand = 'Goodyear' >>> c = car(t) >>> c.tire.brand 'Goodyear'Đã trả lời ngày 24 tháng 5 năm 2010 lúc 23:18May 24, 2010 at 23:18
Gonsalugonsalugonsalu
3.1252 Huy hiệu vàng17 Huy hiệu bạc18 Huy hiệu đồng2 gold badges17 silver badges18 bronze badges
Bạn có thể có cả phiên bản và lớp là thuộc tính của cả hai lớp và phiên bản - tất cả bốn kết hợp đều hoạt động tốt (và có thể được kết hợp tự do). Tuy nhiên, hãy ghi nhớ sự khác biệt giữa một lớp và một thể hiện của nó - cách bạn diễn đạt câu hỏi của bạn cho thấy một số nhầm lẫn. Dù sao, hãy đặt câu hỏi của bạn theo nghĩa đen:
class tire(object): ...class body here... class car(object): thetire = tire ...rest of class body here...Một lớp có thể gọi là xe có một lớp gọi là Tyre là một thuộc tính?
Bài tập >>> class tire: ... pass ... >>> class car: ... def __init__(self, tire): ... self.tire = tire ... >>> t = tire() >>> t.brand = 'Goodyear' >>> c = car(t) >>> c.tire.brand 'Goodyear' 4 trong phần thân của >>> class tire: ... pass ... >>> class car: ... def __init__(self, tire): ... self.tire = tire ... >>> t = tire() >>> t.brand = 'Goodyear' >>> c = car(t) >>> c.tire.brand 'Goodyear' 5 sẽ không hoạt động (đặt tên nhầm lẫn!-) Vì vậy, bạn cần đặt tên cho thuộc tính lớp khác với lớp có giá trị của nó. . Đó có phải là nguồn gốc của vấn đề khiến bạn hỏi câu hỏi này không?
Đã trả lời ngày 25 tháng 5 năm 2010 lúc 0:04May 25, 2010 at 0:04
Alex Martellialex MartelliAlex Martelli
826K163 Huy hiệu vàng1203 Huy hiệu bạc1382 Huy hiệu Đồng163 gold badges1203 silver badges1382 bronze badges
Chắc chắn rồi; Các lớp, giống như bất kỳ giá trị nào khác, có thể là thuộc tính lớp hoặc phiên bản:
class A(object): pass class B(object): class_attr = A def __init__(self): self.instance_attr = AVới mã này, bạn có thể sử dụng >>> class tire: ... pass ... >>> class car: ... def __init__(self, tire): ... self.tire = tire ... >>> t = tire() >>> t.brand = 'Goodyear' >>> c = car(t) >>> c.tire.brand 'Goodyear' 7 hoặc >>> class tire: ... pass ... >>> class car: ... def __init__(self, tire): ... self.tire = tire ... >>> t = tire() >>> t.brand = 'Goodyear' >>> c = car(t) >>> c.tire.brand 'Goodyear' 8 để truy cập >>> class tire: ... pass ... >>> class car: ... def __init__(self, tire): ... self.tire = tire ... >>> t = tire() >>> t.brand = 'Goodyear' >>> c = car(t) >>> c.tire.brand 'Goodyear' 9.
Đã trả lời ngày 24 tháng 5 năm 2010 lúc 23:12May 24, 2010 at 23:12
John Millikinjohn MillikinJohn Millikin
Phim thương hiệu vàng 193K3939 gold badges211 silver badges222 bronze badges
Thuộc tính lớp và đối tượng là gì? Có gì khác biệt? Tại sao?
Trước khi so sánh và ví dụ về các thuộc tính lớp và đối tượng, trước tiên hãy xác định chúng -
- Một thuộc tính lớp là một biến thuộc về một lớp nhất định chứ không phải là một đối tượng cụ thể. Mỗi phiên bản của lớp này chia sẻ cùng một biến. Các thuộc tính này thường được xác định bên ngoài hàm tạo class tire(object): ...class body here... class car(object): thetire = tire ...rest of class body here... 0.class attribute is a variable that belongs to a certain class, and not a particular object. Every instance of this class shares the same variable. These attributes are usually defined outside the class tire(object): ...class body here... class car(object): thetire = tire ...rest of class body here... 0 constructor.
- Thuộc tính thể hiện/đối tượng là một biến thuộc về một đối tượng (và chỉ một) đối tượng. Mỗi phiên bản của một lớp trỏ đến các biến thuộc tính của chính nó. Các thuộc tính này được xác định trong hàm tạo class tire(object): ...class body here... class car(object): thetire = tire ...rest of class body here... 0.instance/object attribute is a variable that belongs to one (and only one) object. Every instance of a class points to its own attributes variables. These attributes are defined within the class tire(object): ...class body here... class car(object): thetire = tire ...rest of class body here... 0 constructor.
Tại sao mặc dù?
Tại sao người ta cần sử dụng các thuộc tính lớp và thuộc tính đối tượng?
Trong một thế giới song song chỉ có những con chó, mỗi con chó có một cái tên và một độ tuổi. Tổng số con chó phải được cập nhật mọi lúc. Tất cả điều này phải được xác định trong một lớp! Điều này có thể trông giống như thế này:
class Dog:dogs_count = 0 def __init__(self, name, age):
self.name = name
self.age = age
print("Welcome to this world {}!".format(self.name))
Dog.dogs_count += 1 def __del__(self):
print("Goodbye {} :(".format(self.name))
Dog.dogs_count -= 1
Trong lớp này, chúng tôi có một thuộc tính lớp class tire(object): ...class body here... class car(object): thetire = tire ...rest of class body here... 2. Biến này theo dõi số lượng chó chúng ta có trong thế giới chó của chúng ta. Chúng tôi có hai thuộc tính thể hiện, class tire(object): ...class body here... class car(object): thetire = tire ...rest of class body here... 3 và class tire(object): ...class body here... class car(object): thetire = tire ...rest of class body here... 4. Các biến này là duy nhất cho mỗi con chó (thuộc tính của mọi trường hợp có các vị trí bộ nhớ khác nhau). Mỗi khi chức năng class tire(object): ...class body here... class car(object): thetire = tire ...rest of class body here... 0 được thực thi, class tire(object): ...class body here... class car(object): thetire = tire ...rest of class body here... 2 tăng lên. Tương tự như vậy - mỗi khi một con chó chết (không may là những con chó không sống mãi mãi trong thế giới này), gọi phương pháp ____27, class tire(object): ...class body here... class car(object): thetire = tire ...rest of class body here... 2 giảm.
a = Dog("Max", 1)print("Number of dogs: {}".format(Dog.dogs_count))
b = Dog("Charlie", 7)
del a
c = Dog("Spot", 4.5)
print("Number of dogs: {}".format(Dog.dogs_count))
del b
del c
print("Number of dogs: {}".format(Dog.dogs_count))Output:
Welcome to this world Max!
Number of dogs: 1
Welcome to this world Charlie!
Goodbye Max :(
Welcome to this world Spot!
Number of dogs: 2
Goodbye Charlie :(
Goodbye Spot :(
Number of dogs: 0
Ah ha! Chúng tôi đã quản lý để gán các biến duy nhất cho một đối tượng trong khi có một biến được chia sẻ mà tất cả các đối tượng chứa.
Kế thừa của các thuộc tính
Trước khi mở chủ đề này, hãy để Lừa xem thuộc tính class tire(object): ...class body here... class car(object): thetire = tire ...rest of class body here... 9 tích hợp.
class Example:classAttr = 0
def __init__(self, instanceAttr):
self.instanceAttr = instanceAttra = Example(1)
print(a.__dict__)
print(Example.__dict__)Output:
{'instanceAttr': 1}
{'__module__': '__main__', '__doc__': None, '__dict__': <attribute '__dict__' of 'Example' objects>, '__init__': <function Example.__init__ at 0x7f8af2113f28>, 'classAttr': 0, '__weakref__': <attribute '__weakref__' of 'Example' objects>}
Như chúng ta có thể thấy, cả lớp và đối tượng đều có từ điển với các khóa và giá trị thuộc tính. Từ điển lớp lưu trữ nhiều thuộc tính tích hợp mà một thể hiện không chứa.
b = Example(2)print(b.classAttr)
print(Example.classAttr)
b.classAttr = 653
print(b.classAttr)
print(Example.classAttr)Output:
0
0
653
0
Woah. Mang lại những gì tôi đã viết trước đó, mỗi trường hợp của một lớp chia sẻ cùng một thuộc tính lớp. Chuyện gì đã xảy ra ở đây? Chúng tôi đã thay đổi thuộc tính lớp của một trường hợp nhất định, nhưng biến được chia sẻ thực sự thay đổi. Nhìn vào từ điển của các yếu tố này sẽ cung cấp thêm cái nhìn sâu sắc:Bringing back what I wrote earlier, each instance of a class shares the same class attributes. What happened here? We changed the class attribute of a certain instance, but the shared variable didn’t actually change. Taking a look at the dictionaries of these elements will give further insight:
b = Example(2)print(b.__dict__)
print(Example.__dict__)
b.classAttr = 653
print(b.__dict__)
print(Example.__dict__)Output:
{'instanceAttr': 2}
'__module__': '__main__', '__doc__': None, '__dict__': <attribute '__dict__' of 'Example' objects>, '__init__': <function Example.__init__ at 0x7f8af2113f28>, 'classAttr': 0, '__weakref__': <attribute '__weakref__' of 'Example' objects>}
{'instanceAttr': 2, 'classAttr': 653}
{'__module__': '__main__', '__doc__': None, '__dict__': <attribute '__dict__' of 'Example' objects>, '__init__': <function Example.__init__ at 0x7f8af2113f28>, 'classAttr': 0, '__weakref__': <attribute '__weakref__' of 'Example' objects>}
Nhìn kỹ, chúng tôi nhận thấy rằng class A(object): pass class B(object): class_attr = A def __init__(self): self.instance_attr = A 0 đã được thêm vào từ điển của đối tượng, với giá trị sửa đổi của nó. Từ điển lớp học vẫn giữ nguyên, điều này cho thấy các thuộc tính lớp có thể hoạt động như các thuộc tính thể hiện đôi khi.
Sự kết luận
Tóm lại, các thuộc tính lớp và đối tượng cực kỳ hữu ích nhưng có thể trở nên lộn xộn khi được sử dụng cùng nhau. Các thuộc tính lớp thuận lợi khi mỗi đối tượng cần chia sẻ một biến, chẳng hạn như bộ đếm. Các thuộc tính đối tượng có lợi thế khi mỗi đối tượng duy nhất cần các giá trị riêng của nó, một cái gì đó làm cho chúng khác với các đối tượng khác.