Lớp python với các thuộc tính

[câu trả lời được viết dựa trên python 3. 4;

Bạn có thể làm điều này với một siêu dữ liệu. hầu hết. Dappawit gần như hoạt động, nhưng tôi nghĩ nó có một lỗ hổng

class MetaFoo[type]:
    @property
    def thingy[cls]:
        return cls._thingy

class Foo[object, metaclass=MetaFoo]:
    _thingy = 23

Điều này mang lại cho bạn một thuộc tính lớp trên Foo, nhưng có một vấn đề

print["Foo.thingy is {}".format[Foo.thingy]]
# Foo.thingy is 23
# Yay, the classmethod-property is working as intended!
foo = Foo[]
if hasattr[foo, "thingy"]:
    print["Foo[].thingy is {}".format[foo.thingy]]
else:
    print["Foo instance has no attribute 'thingy'"]
# Foo instance has no attribute 'thingy'
# Wha....?

Cái quái gì đang xảy ra thế này?

Tôi đã đập đầu vào vấn đề này khá lâu trước khi tìm ra điều mà tôi tin là câu trả lời. Python @properties là một tập hợp con của các bộ mô tả và, từ tài liệu mô tả [nhấn mạnh của tôi]

Hành vi mặc định để truy cập thuộc tính là lấy, đặt hoặc xóa thuộc tính khỏi từ điển của đối tượng. Chẳng hạn,

print["Foo.thingy is {}".format[Foo.thingy]]
# Foo.thingy is 23
# Yay, the classmethod-property is working as intended!
foo = Foo[]
if hasattr[foo, "thingy"]:
    print["Foo[].thingy is {}".format[foo.thingy]]
else:
    print["Foo instance has no attribute 'thingy'"]
# Foo instance has no attribute 'thingy'
# Wha....?
8 có chuỗi tra cứu bắt đầu bằng
print["Foo.thingy is {}".format[Foo.thingy]]
# Foo.thingy is 23
# Yay, the classmethod-property is working as intended!
foo = Foo[]
if hasattr[foo, "thingy"]:
    print["Foo[].thingy is {}".format[foo.thingy]]
else:
    print["Foo instance has no attribute 'thingy'"]
# Foo instance has no attribute 'thingy'
# Wha....?
9, sau đó là
class Foo[object, metaclass=MetaFoo]:
    _thingy = 23

    @property
    def thingy[self]:
        return type[self].thingy
0 và tiếp tục thông qua các lớp cơ sở của
class Foo[object, metaclass=MetaFoo]:
    _thingy = 23

    @property
    def thingy[self]:
        return type[self].thingy
1 ngoại trừ siêu dữ liệu

Vì vậy, thứ tự giải quyết phương pháp không bao gồm các thuộc tính lớp của chúng tôi [hoặc bất kỳ thứ gì khác được định nghĩa trong siêu dữ liệu]. Có thể tạo một lớp con của trình trang trí thuộc tính tích hợp hoạt động khác, nhưng [cần trích dẫn] Tôi có ấn tượng rằng các nhà phát triển có lý do chính đáng [mà tôi không hiểu] để làm theo cách đó

Điều đó không có nghĩa là chúng ta không may mắn; . và chúng tôi có thể lấy lớp từ

class Foo[object, metaclass=MetaFoo]:
    _thingy = 23

    @property
    def thingy[self]:
        return type[self].thingy
2 trong thể hiện, chúng tôi có thể sử dụng lớp này để tạo bộ điều phối @property

class Foo[object, metaclass=MetaFoo]:
    _thingy = 23

    @property
    def thingy[self]:
        return type[self].thingy

Bây giờ

class Foo[object, metaclass=MetaFoo]:
    _thingy = 23

    @property
    def thingy[self]:
        return type[self].thingy
3 hoạt động như dự định cho cả lớp và cá thể. Nó cũng sẽ tiếp tục làm điều đúng đắn nếu một lớp dẫn xuất thay thế lớp cơ sở của nó là
class Foo[object, metaclass=MetaFoo]:
    _thingy = 23

    @property
    def thingy[self]:
        return type[self].thingy
4 [đây là trường hợp sử dụng đã đưa tôi vào cuộc tìm kiếm này ban đầu]

Điều này không làm tôi hài lòng 100% - việc phải thiết lập trong cả lớp siêu dữ liệu và lớp đối tượng có cảm giác như nó vi phạm nguyên tắc DRY. Nhưng cái sau chỉ là một bộ điều phối một dòng;

Python là một ngôn ngữ thiết lập hướng đối tượng

  • 2. Build layer [lớp] trong Python
    1. 2. 1. Tham số của lớp trong Python
    2. 2. 2. Câu lệnh pass with class trong Python
  • 3. Tạo đối tượng [object] trong Python
  • Đây là bài 32/54 bài của series môn học Ngôn ngữ lập trình Python

    1. Python là một ngôn ngữ thiết lập hướng đối tượng

    Python là một ngôn ngữ lập trình hướng đối tượng [OOP – ngôn ngữ lập trình hướng đối tượng]. Hầu hết mọi thứ trong Python đều là đối tượng [đối tượng] với các thuộc tính [thuộc tính] và phương thức [phương thức] của đối tượng riêng đó

    Ví dụ, mọi giá trị dữ liệu trong Python đều được xem là một loại đối tượng [object]. Khi gán một giá trị cho một biến [variable] thì bản chất biến đó sẽ tham chiếu đến một đối tượng lưu trữ giá trị dữ liệu đó

    Trước khi tìm hiểu về OOP trong Python, các bạn có thể tham khảo trước loạt bài học Phương pháp thiết lập hướng đối tượng. Series bài học này giúp các bạn có tư duy cơ bản về OOP với C++, làm cơ sở để học và hiểu OOP trong các ngôn ngữ khác dễ dàng hơn

    2. Build layer [lớp] trong Python

    Một lớp [lớp] là một thiết kế [bản thiết kế] hay mẫu [nguyên mẫu] cho các đối tượng cùng kiểu. Ví dụ, chúng ta có một lớp Cat chứa tất cả thông tin về một con mèo như tên, màu sắc, cân nặng, hành động bắt chuột,… Một công cụ con mèo có thể là một đối tượng và sẽ có những thông tin chung của

    Trong Python, chúng ta sử dụng từ khóa class để tạo một lớp [class]

    class Cat:
      # Properties of Cat class
      name = "Tom"
      color = "grey and white"
      # Methods of Cat class
      def catchMouse[self]:
        print["Catch Jerry mouse."]
      def sleep[self]:
        print["Take a nap."]
    

    Trong ví dụ trên, chúng ta định nghĩa một lớp [lớp] Cat bao gồm các thuộc tính như tên, màu sắc và các phương thức là

    class Foo[object, metaclass=MetaFoo]:
        _thingy = 23
    
        @property
        def thingy[self]:
            return type[self].thingy
    
    5 và
    class Foo[object, metaclass=MetaFoo]:
        _thingy = 23
    
        @property
        def thingy[self]:
            return type[self].thingy
    
    6

    2. 1. Tham số của lớp trong Python

    Tham số

    class Cat:
      # Properties of Cat class
      name = "Tom"
      color = "grey and white"
      # Methods of Cat class
      def catchMouse[self]:
        print[self.name, "catches Jerry mouse."]
      def sleep[self]:
        print[self.name, "takes a nap."]
    
    0 là một tham chiếu đến các đối tượng hiện tại của lớp và được sử dụng để truy cập các biến thuộc về lớp đó

    class Cat:
      # Properties of Cat class
      name = "Tom"
      color = "grey and white"
      # Methods of Cat class
      def catchMouse[self]:
        print[self.name, "catches Jerry mouse."]
      def sleep[self]:
        print[self.name, "takes a nap."]
    

    Nhất thiết phải đặt tên tham số này là

    class Cat:
      # Properties of Cat class
      name = "Tom"
      color = "grey and white"
      # Methods of Cat class
      def catchMouse[self]:
        print[self.name, "catches Jerry mouse."]
      def sleep[self]:
        print[self.name, "takes a nap."]
    
    0. Chúng ta có thể đặt bất cứ tên gì mà chúng ta thích. Nhưng Python sẽ mặc định tham số đầu tiên của bất kỳ hàm nào trong lớp là tham số
    class Cat:
      # Properties of Cat class
      name = "Tom"
      color = "grey and white"
      # Methods of Cat class
      def catchMouse[self]:
        print[self.name, "catches Jerry mouse."]
      def sleep[self]:
        print[self.name, "takes a nap."]
    
    0

    ________số 8

    2. 2. Câu lệnh pass with class trong Python

    Định nghĩa của lớp [lớp] không được để trống. Nhưng nếu không biết thuộc tính và phương thức của lớp để xác định nghĩa thì có thể sử dụng câu lệnh

    class Cat:
      # Properties of Cat class
      name = "Tom"
      color = "grey and white"
      # Methods of Cat class
      def catchMouse[self]:
        print[self.name, "catches Jerry mouse."]
      def sleep[self]:
        print[self.name, "takes a nap."]
    
    3 trong lớp để tránh gặp lỗi

    print["Foo.thingy is {}".format[Foo.thingy]]
    # Foo.thingy is 23
    # Yay, the classmethod-property is working as intended!
    foo = Foo[]
    if hasattr[foo, "thingy"]:
        print["Foo[].thingy is {}".format[foo.thingy]]
    else:
        print["Foo instance has no attribute 'thingy'"]
    # Foo instance has no attribute 'thingy'
    # Wha....?
    
    0

    3. Tạo đối tượng [object] trong Python

    Object [đối tượng] là một công cụ có thể thực hiện được của lớp [class]. Chúng ta có thể sử dụng tên của lớp để tạo một đối tượng. Khi một đối tượng được tạo ra thì Python sẽ cấp phát vùng nhớ để lưu trữ các đối tượng đó

    print["Foo.thingy is {}".format[Foo.thingy]]
    # Foo.thingy is 23
    # Yay, the classmethod-property is working as intended!
    foo = Foo[]
    if hasattr[foo, "thingy"]:
        print["Foo[].thingy is {}".format[foo.thingy]]
    else:
        print["Foo instance has no attribute 'thingy'"]
    # Foo instance has no attribute 'thingy'
    # Wha....?
    
    1Kết quả
    print["Foo.thingy is {}".format[Foo.thingy]]
    # Foo.thingy is 23
    # Yay, the classmethod-property is working as intended!
    foo = Foo[]
    if hasattr[foo, "thingy"]:
        print["Foo[].thingy is {}".format[foo.thingy]]
    else:
        print["Foo instance has no attribute 'thingy'"]
    # Foo instance has no attribute 'thingy'
    # Wha....?
    
    2

    Chúng ta có thể xóa một đối tượng bằng từ khóa xóa

    print["Foo.thingy is {}".format[Foo.thingy]]
    # Foo.thingy is 23
    # Yay, the classmethod-property is working as intended!
    foo = Foo[]
    if hasattr[foo, "thingy"]:
        print["Foo[].thingy is {}".format[foo.thingy]]
    else:
        print["Foo instance has no attribute 'thingy'"]
    # Foo instance has no attribute 'thingy'
    # Wha....?
    
    3Kết quả
    print["Foo.thingy is {}".format[Foo.thingy]]
    # Foo.thingy is 23
    # Yay, the classmethod-property is working as intended!
    foo = Foo[]
    if hasattr[foo, "thingy"]:
        print["Foo[].thingy is {}".format[foo.thingy]]
    else:
        print["Foo instance has no attribute 'thingy'"]
    # Foo instance has no attribute 'thingy'
    # Wha....?
    
    4

    Ở bài này, chúng ta đã tìm hiểu cách tạo ra một lớp [class] và một đối tượng [object] trong Python một cách đơn giản nhất. Và trong Python, một lớp [class] lúc nào cũng có một hàm

    class Cat:
      # Properties of Cat class
      name = "Tom"
      color = "grey and white"
      # Methods of Cat class
      def catchMouse[self]:
        print[self.name, "catches Jerry mouse."]
      def sleep[self]:
        print[self.name, "takes a nap."]
    
    4 được dựng sẵn [tích hợp sẵn]. Hàm này được gọi là hàm khởi tạo [hàm tạo] của lớp. Trong nhiều trường hợp, chúng ta cần xây dựng lại hàm
    class Cat:
      # Properties of Cat class
      name = "Tom"
      color = "grey and white"
      # Methods of Cat class
      def catchMouse[self]:
        print[self.name, "catches Jerry mouse."]
      def sleep[self]:
        print[self.name, "takes a nap."]
    
    4 khi tạo một lớp. Chúng ta sẽ tìm hiểu kỹ về hàm
    class Cat:
      # Properties of Cat class
      name = "Tom"
      color = "grey and white"
      # Methods of Cat class
      def catchMouse[self]:
        print[self.name, "catches Jerry mouse."]
      def sleep[self]:
        print[self.name, "takes a nap."]
    
    4 ở bài Hàm khởi tạo [constructor] của lớp trong Python

    Chủ Đề