Hướng dẫn how do i create a multiple object class in python? - làm cách nào để tạo một lớp nhiều đối tượng trong python?

Giả sử bạn phải tạo 10 đối tượng lớp trong Python và làm điều gì đó với chúng, như:

Show
obj_1 = MyClass()
other_object.add(obj_1)
obj_2 = MyClass()
other_object.add(obj_2)
.
.
.
obj_10 = MyClass()
other_object.add(obj_10)

Làm thế nào bạn sẽ làm điều đó với một vòng lặp và gán một biến cho mỗi đối tượng (như

objs = list()
for i in range(10):
    objs.append(MyClass())
9), để mã sẽ ngắn hơn? Mỗi đối tượng phải được truy cập bên ngoài vòng lặp

obj_1.do_sth()

Đã hỏi ngày 6 tháng 2 năm 2014 lúc 9:34Feb 6, 2014 at 9:34

Hướng dẫn how do i create a multiple object class in python? - làm cách nào để tạo một lớp nhiều đối tượng trong python?

Alwbtcalwbtcalwbtc

26.8K59 Huy hiệu vàng129 Huy hiệu bạc185 Huy hiệu Đồng59 gold badges129 silver badges185 bronze badges

1

Câu hỏi này được hỏi mỗi ngày trong một số biến thể. Câu trả lời là: Giữ dữ liệu của bạn ra khỏi tên biến của bạn và đây là bài đăng trên blog bắt buộc.

Trong trường hợp này, tại sao không lập một danh sách các OBJ?

objs = [MyClass() for i in range(10)]
for obj in objs:
    other_object.add(obj)

objs[0].do_sth()

Đã trả lời ngày 6 tháng 2 năm 2014 lúc 9:39Feb 6, 2014 at 9:39

Hướng dẫn how do i create a multiple object class in python? - làm cách nào để tạo một lớp nhiều đối tượng trong python?

REMCOGERLICHREMCOGERLICHRemcoGerlich

29,7K5 Huy hiệu vàng63 Huy hiệu bạc78 Huy hiệu Đồng5 gold badges63 silver badges78 bronze badges

2

Bạn có thể sử dụng danh sách để xác định nó.

objs = list()
for i in range(10):
    objs.append(MyClass())

Đã trả lời ngày 6 tháng 2 năm 2014 lúc 9:40Feb 6, 2014 at 9:40

Hướng dẫn how do i create a multiple object class in python? - làm cách nào để tạo một lớp nhiều đối tượng trong python?

3

Tạo một từ điển như nó đã đề cập, nhưng trong trường hợp này, mỗi khóa có tên của tên đối tượng mà bạn muốn tạo. Sau đó, giá trị được đặt làm lớp bạn muốn khởi tạo, xem ví dụ:

class MyClass:
   def __init__(self, name):
       self.name = name
       self.checkme = 'awesome {}'.format(self.name)
...

instanceNames = ['red', 'green', 'blue']

# Here you use the dictionary
holder = {name: MyClass(name=name) for name in instanceNames}

Sau đó, bạn chỉ cần gọi phím chủ và bạn sẽ có tất cả các thuộc tính và phương thức của lớp bạn có sẵn cho bạn.

holder['red'].checkme

output:

'awesome red'

Đã trả lời ngày 18 tháng 1 năm 2017 lúc 13:11Jan 18, 2017 at 13:11

Hướng dẫn how do i create a multiple object class in python? - làm cách nào để tạo một lớp nhiều đối tượng trong python?

JobeljobelJobel

6136 Huy hiệu bạc12 Huy hiệu Đồng6 silver badges12 bronze badges

0

Sử dụng từ điển cho các tên duy nhất mà không có danh sách tên:

class MyClass:
    def __init__(self, name):
        self.name = name
        self.pretty_print_name()

    def pretty_print_name(self):
    print("This object's name is {}.".format(self.name))

my_objects = {}
for i in range(1,11):
    name = 'obj_{}'.format(i)
    my_objects[name] = my_objects.get(name, MyClass(name = name))

Output:

"This object's name is obj_1."
"This object's name is obj_2."
"This object's name is obj_3."
"This object's name is obj_4."
"This object's name is obj_5."
"This object's name is obj_6."
"This object's name is obj_7."
"This object's name is obj_8."
"This object's name is obj_9."
"This object's name is obj_10."

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

Tôi hy vọng đây là thứ bạn đang tìm kiếm.

class Try:
    def do_somthing(self):
        print 'Hello'

if __name__ == '__main__':
    obj_list = []
    for obj in range(10):
        obj = Try()
        obj_list.append(obj)

    obj_list[0].do_somthing()

Output:

obj_1.do_sth()
0

Đã trả lời ngày 6 tháng 2 năm 2014 lúc 9:45Feb 6, 2014 at 9:45

Hướng dẫn how do i create a multiple object class in python? - làm cách nào để tạo một lớp nhiều đối tượng trong python?

Tanveer Alamtanveer AlamTanveer Alam

5.0673 Huy hiệu vàng20 Huy hiệu bạc42 Huy hiệu Đồng3 gold badges20 silver badges42 bronze badges

2

Đôi khi bạn cần viết một lớp Python cung cấp nhiều cách để xây dựng các đối tượng. Nói cách khác, bạn muốn một lớp thực hiện nhiều hàm tạo. Loại lớp này có ích khi bạn cần tạo các phiên bản bằng các loại hoặc số lượng đối số khác nhau. Có các công cụ để cung cấp nhiều hàm tạo sẽ giúp bạn viết các lớp linh hoạt có thể thích ứng với nhu cầu thay đổi.multiple constructors. This kind of class comes in handy when you need to create instances using different types or numbers of arguments. Having the tools to provide multiple constructors will help you write flexible classes that can adapt to changing needs.

Trong Python, có một số kỹ thuật và công cụ mà bạn có thể sử dụng để xây dựng các lớp, bao gồm mô phỏng nhiều hàm tạo thông qua các đối số tùy chọn, tùy chỉnh tạo thể hiện thông qua các phương thức lớp và thực hiện công văn đặc biệt với các trình trang trí. Nếu bạn muốn tìm hiểu về các kỹ thuật và công cụ này, thì hướng dẫn này là dành cho bạn.

Trong hướng dẫn này, bạn sẽ học cách:

  • Sử dụng các đối số tùy chọn và kiểm tra loại để mô phỏng nhiều hàm tạooptional arguments and type checking to simulate multiple constructors
  • Viết nhiều hàm tạo bằng cách sử dụng trình trang trí
    class MyClass:
       def __init__(self, name):
           self.name = name
           self.checkme = 'awesome {}'.format(self.name)
    ...
    
    instanceNames = ['red', 'green', 'blue']
    
    # Here you use the dictionary
    holder = {name: MyClass(name=name) for name in instanceNames}
    
    0 tích hợp
    class MyClass:
       def __init__(self, name):
           self.name = name
           self.checkme = 'awesome {}'.format(self.name)
    ...
    
    instanceNames = ['red', 'green', 'blue']
    
    # Here you use the dictionary
    holder = {name: MyClass(name=name) for name in instanceNames}
    
    0
    decorator
  • Quá tải các hàm tạo lớp của bạn bằng cách sử dụng trình trang trí
    class MyClass:
       def __init__(self, name):
           self.name = name
           self.checkme = 'awesome {}'.format(self.name)
    ...
    
    instanceNames = ['red', 'green', 'blue']
    
    # Here you use the dictionary
    holder = {name: MyClass(name=name) for name in instanceNames}
    
    1
    class MyClass:
       def __init__(self, name):
           self.name = name
           self.checkme = 'awesome {}'.format(self.name)
    ...
    
    instanceNames = ['red', 'green', 'blue']
    
    # Here you use the dictionary
    holder = {name: MyClass(name=name) for name in instanceNames}
    
    1
    decorator

Bạn cũng đã học được cách Python xây dựng các trường hợp của một lớp nhất định và cách một số lớp thư viện tiêu chuẩn cung cấp nhiều hàm tạo.constructs instances of a regular class and how some standard-library classes provide multiple constructors.

Với kiến ​​thức này, bây giờ bạn có thể thêm gia vị cho các lớp học của mình với nhiều nhà xây dựng, trang bị cho họ một số cách để giải quyết quá trình khởi tạo trong Python.

Các lớp học khởi tạo ở Python

Python hỗ trợ lập trình hướng đối tượng với các lớp đơn giản để tạo và sử dụng. Các lớp Python cung cấp các tính năng mạnh mẽ có thể giúp bạn viết phần mềm tốt hơn. Các lớp giống như bản thiết kế cho các đối tượng, còn được gọi là trường hợp. Theo cùng một cách mà bạn có thể xây dựng một số ngôi nhà từ một bản thiết kế duy nhất, bạn có thể xây dựng một số trường hợp từ một lớp.classes that are straightforward to create and use. Python classes offer powerful features that can help you write better software. Classes are like blueprints for objects, also known as instances. In the same way that you can build several houses from a single blueprint, you can build several instances from a class.

Để xác định một lớp trong Python, bạn cần sử dụng từ khóa

class MyClass:
   def __init__(self, name):
       self.name = name
       self.checkme = 'awesome {}'.format(self.name)
...

instanceNames = ['red', 'green', 'blue']

# Here you use the dictionary
holder = {name: MyClass(name=name) for name in instanceNames}
3 theo sau là tên lớp:

>>>

obj_1.do_sth()
1

Python có một bộ phương pháp đặc biệt phong phú mà bạn có thể sử dụng trong các lớp học của mình. Python ngầm gọi các phương thức đặc biệt để tự động thực hiện nhiều hoạt động khác nhau trên các trường hợp. Có các phương pháp đặc biệt để làm cho các đối tượng của bạn trở nên dễ dàng, cung cấp một biểu diễn chuỗi phù hợp cho các đối tượng của bạn, khởi tạo các thuộc tính thể hiện và nhiều hơn nữa.

Một phương pháp đặc biệt khá phổ biến là

class MyClass:
   def __init__(self, name):
       self.name = name
       self.checkme = 'awesome {}'.format(self.name)
...

instanceNames = ['red', 'green', 'blue']

# Here you use the dictionary
holder = {name: MyClass(name=name) for name in instanceNames}
4. Phương pháp này cung cấp những gì được gọi là trình khởi tạo thể hiện trong Python. Phương thức này Công việc là để khởi tạo các thuộc tính thể hiện với các giá trị phù hợp khi bạn khởi tạo một lớp nhất định.instance initializer in Python. This method’s job is to initialize instance attributes with appropriate values when you instantiate a given class.

Trong

class MyClass:
   def __init__(self, name):
       self.name = name
       self.checkme = 'awesome {}'.format(self.name)
...

instanceNames = ['red', 'green', 'blue']

# Here you use the dictionary
holder = {name: MyClass(name=name) for name in instanceNames}
5, đối số đầu tiên của phương thức
class MyClass:
   def __init__(self, name):
       self.name = name
       self.checkme = 'awesome {}'.format(self.name)
...

instanceNames = ['red', 'green', 'blue']

# Here you use the dictionary
holder = {name: MyClass(name=name) for name in instanceNames}
4 được gọi là
class MyClass:
   def __init__(self, name):
       self.name = name
       self.checkme = 'awesome {}'.format(self.name)
...

instanceNames = ['red', 'green', 'blue']

# Here you use the dictionary
holder = {name: MyClass(name=name) for name in instanceNames}
7. Đối số này giữ đối tượng hoặc thể hiện hiện tại, được truyền ngầm trong cuộc gọi phương thức. Đối số này là phổ biến cho mọi phương thức thể hiện trong Python. Đối số thứ hai của
class MyClass:
   def __init__(self, name):
       self.name = name
       self.checkme = 'awesome {}'.format(self.name)
...

instanceNames = ['red', 'green', 'blue']

# Here you use the dictionary
holder = {name: MyClass(name=name) for name in instanceNames}
4 được gọi là
class MyClass:
   def __init__(self, name):
       self.name = name
       self.checkme = 'awesome {}'.format(self.name)
...

instanceNames = ['red', 'green', 'blue']

# Here you use the dictionary
holder = {name: MyClass(name=name) for name in instanceNames}
9 và sẽ giữ tên người đó dưới dạng chuỗi.

Khi bạn đã xác định một lớp, bạn có thể bắt đầu khởi tạo nó. Nói cách khác, bạn có thể bắt đầu tạo các đối tượng của lớp đó. Để làm điều này, bạn sẽ sử dụng một cú pháp quen thuộc. Chỉ cần gọi lớp bằng cách sử dụng một cặp dấu ngoặc đơn (

holder['red'].checkme
0), đó là cùng một cú pháp mà bạn sử dụng để gọi bất kỳ chức năng Python nào:instantiating it. In other words, you can start creating objects of that class. To do this, you’ll use a familiar syntax. Just call the class using a pair of parentheses (
holder['red'].checkme
0), which is the same syntax that you use to call any Python function:

>>>

obj_1.do_sth()
2

Python có một bộ phương pháp đặc biệt phong phú mà bạn có thể sử dụng trong các lớp học của mình. Python ngầm gọi các phương thức đặc biệt để tự động thực hiện nhiều hoạt động khác nhau trên các trường hợp. Có các phương pháp đặc biệt để làm cho các đối tượng của bạn trở nên dễ dàng, cung cấp một biểu diễn chuỗi phù hợp cho các đối tượng của bạn, khởi tạo các thuộc tính thể hiện và nhiều hơn nữa.class constructor. Calling a class, like you did with

class MyClass:
   def __init__(self, name):
       self.name = name
       self.checkme = 'awesome {}'.format(self.name)
...

instanceNames = ['red', 'green', 'blue']

# Here you use the dictionary
holder = {name: MyClass(name=name) for name in instanceNames}
5, triggers Python’s class instantiation process, which internally runs in two steps:

  1. Một phương pháp đặc biệt khá phổ biến là
    class MyClass:
       def __init__(self, name):
           self.name = name
           self.checkme = 'awesome {}'.format(self.name)
    ...
    
    instanceNames = ['red', 'green', 'blue']
    
    # Here you use the dictionary
    holder = {name: MyClass(name=name) for name in instanceNames}
    
    4. Phương pháp này cung cấp những gì được gọi là trình khởi tạo thể hiện trong Python. Phương thức này Công việc là để khởi tạo các thuộc tính thể hiện với các giá trị phù hợp khi bạn khởi tạo một lớp nhất định.
    a new instance of the target class.
  2. Trong
    class MyClass:
       def __init__(self, name):
           self.name = name
           self.checkme = 'awesome {}'.format(self.name)
    ...
    
    instanceNames = ['red', 'green', 'blue']
    
    # Here you use the dictionary
    holder = {name: MyClass(name=name) for name in instanceNames}
    
    5, đối số đầu tiên của phương thức
    class MyClass:
       def __init__(self, name):
           self.name = name
           self.checkme = 'awesome {}'.format(self.name)
    ...
    
    instanceNames = ['red', 'green', 'blue']
    
    # Here you use the dictionary
    holder = {name: MyClass(name=name) for name in instanceNames}
    
    4 được gọi là
    class MyClass:
       def __init__(self, name):
           self.name = name
           self.checkme = 'awesome {}'.format(self.name)
    ...
    
    instanceNames = ['red', 'green', 'blue']
    
    # Here you use the dictionary
    holder = {name: MyClass(name=name) for name in instanceNames}
    
    7. Đối số này giữ đối tượng hoặc thể hiện hiện tại, được truyền ngầm trong cuộc gọi phương thức. Đối số này là phổ biến cho mọi phương thức thể hiện trong Python. Đối số thứ hai của
    class MyClass:
       def __init__(self, name):
           self.name = name
           self.checkme = 'awesome {}'.format(self.name)
    ...
    
    instanceNames = ['red', 'green', 'blue']
    
    # Here you use the dictionary
    holder = {name: MyClass(name=name) for name in instanceNames}
    
    4 được gọi là
    class MyClass:
       def __init__(self, name):
           self.name = name
           self.checkme = 'awesome {}'.format(self.name)
    ...
    
    instanceNames = ['red', 'green', 'blue']
    
    # Here you use the dictionary
    holder = {name: MyClass(name=name) for name in instanceNames}
    
    9 và sẽ giữ tên người đó dưới dạng chuỗi.
    the instance with suitable instance attribute values.

Khi bạn đã xác định một lớp, bạn có thể bắt đầu khởi tạo nó. Nói cách khác, bạn có thể bắt đầu tạo các đối tượng của lớp đó. Để làm điều này, bạn sẽ sử dụng một cú pháp quen thuộc. Chỉ cần gọi lớp bằng cách sử dụng một cặp dấu ngoặc đơn (

holder['red'].checkme
0), đó là cùng một cú pháp mà bạn sử dụng để gọi bất kỳ chức năng Python nào:

Trong Python, tên lớp cung cấp những gì các ngôn ngữ khác, chẳng hạn như C ++ và Java, gọi hàm tạo lớp. Gọi một lớp, giống như bạn đã làm với

class MyClass:
   def __init__(self, name):
       self.name = name
       self.checkme = 'awesome {}'.format(self.name)
...

instanceNames = ['red', 'green', 'blue']

# Here you use the dictionary
holder = {name: MyClass(name=name) for name in instanceNames}
5, kích hoạt quá trình khởi tạo lớp Python, trong hai bước chạy trong hai bước:

Tạo một thể hiện mới của lớp đích.

Khởi tạo thể hiện với các giá trị thuộc tính thể hiện phù hợp.

Để tiếp tục với ví dụ trên, giá trị mà bạn chuyển dưới dạng đối số cho

class MyClass:
   def __init__(self, name):
       self.name = name
       self.checkme = 'awesome {}'.format(self.name)
...

instanceNames = ['red', 'green', 'blue']

# Here you use the dictionary
holder = {name: MyClass(name=name) for name in instanceNames}
5 được chuyển nội bộ đến
class MyClass:
   def __init__(self, name):
       self.name = name
       self.checkme = 'awesome {}'.format(self.name)
...

instanceNames = ['red', 'green', 'blue']

# Here you use the dictionary
holder = {name: MyClass(name=name) for name in instanceNames}
4 và sau đó được gán cho thuộc tính thể hiện
holder['red'].checkme
4. Bằng cách này, bạn khởi tạo phiên bản người của bạn,
holder['red'].checkme
5, với dữ liệu hợp lệ mà bạn có thể xác nhận bằng cách truy cập
holder['red'].checkme
4. Thành công!
holder['red'].checkme
7 thực sự là tên của anh ấy.

Bây giờ bạn đã hiểu cơ chế khởi tạo đối tượng, bạn đã sẵn sàng tìm hiểu những gì Python làm trước khi nó đi đến điểm này trong quá trình khởi tạo. Nó thời gian để đào sâu vào một phương pháp đặc biệt khác, được gọi là

holder['red'].checkme
8. Phương pháp này quan tâm đến việc tạo ra các trường hợp mới trong Python.

Phương thức đặc biệt

holder['red'].checkme
8 lấy lớp cơ bản làm đối số đầu tiên của nó và trả về một đối tượng mới. Đối tượng này thường là một thể hiện của lớp đầu vào, nhưng trong một số trường hợp, nó có thể là một ví dụ của một lớp khác.multiple constructors in your classes. In other words, you’ll provide multiple ways to construct objects of a given Python class.

Nếu đối tượng holder['red'].checkme 8 trả về là một thể hiện của lớp hiện tại, thì trường hợp này ngay lập tức được chuyển sang class MyClass: def __init__(self, name): self.name = name self.checkme = 'awesome {}'.format(self.name) ... instanceNames = ['red', 'green', 'blue'] # Here you use the dictionary holder = {name: MyClass(name=name) for name in instanceNames} 4 cho mục đích khởi tạo. Hai bước này chạy khi bạn gọi lớp.

Lớp Python từ ____ ____62 cung cấp việc triển khai cơ sở hoặc mặc định là

holder['red'].checkme
8 và
class MyClass:
   def __init__(self, name):
       self.name = name
       self.checkme = 'awesome {}'.format(self.name)
...

instanceNames = ['red', 'green', 'blue']

# Here you use the dictionary
holder = {name: MyClass(name=name) for name in instanceNames}
4. Không giống như với
class MyClass:
   def __init__(self, name):
       self.name = name
       self.checkme = 'awesome {}'.format(self.name)
...

instanceNames = ['red', 'green', 'blue']

# Here you use the dictionary
holder = {name: MyClass(name=name) for name in instanceNames}
4, bạn hiếm khi cần ghi đè
holder['red'].checkme
8 trong các lớp tùy chỉnh của mình. Hầu hết thời gian, bạn có thể dựa vào việc thực hiện mặc định một cách an toàn.

Để tóm tắt những gì bạn đã học được cho đến nay, quá trình khởi tạo Python, bắt đầu khi bạn gọi một lớp với các đối số thích hợp. Sau đó, quá trình chạy qua hai bước: tạo đối tượng với phương thức

holder['red'].checkme
8 và khởi tạo đối tượng với phương thức
class MyClass:
   def __init__(self, name):
       self.name = name
       self.checkme = 'awesome {}'.format(self.name)
...

instanceNames = ['red', 'green', 'blue']

# Here you use the dictionary
holder = {name: MyClass(name=name) for name in instanceNames}
4.

Quá tải phương thức có nghĩa là tùy thuộc vào cách bạn gọi phương thức trong tay, ngôn ngữ sẽ chọn triển khai phù hợp để chạy. Vì vậy, phương pháp của bạn có thể thực hiện các nhiệm vụ khác nhau theo ngữ cảnh của cuộc gọi.

Thật không may, Python không hỗ trợ chức năng quá tải trực tiếp. Các lớp Python giữ tên phương thức trong một từ điển nội bộ được gọi là

'awesome red'
9, giữ không gian tên lớp. Giống như bất kỳ từ điển Python nào,
'awesome red'
9 có thể có các khóa lặp lại, vì vậy bạn có thể có nhiều phương thức có cùng tên trong một lớp nhất định. Nếu bạn cố gắng làm như vậy, thì Python sẽ chỉ nhớ lần thực hiện cuối cùng của phương thức:

obj_1.do_sth()
3

Trong ví dụ này, bạn tạo

class MyClass:
    def __init__(self, name):
        self.name = name
        self.pretty_print_name()

    def pretty_print_name(self):
    print("This object's name is {}.".format(self.name))

my_objects = {}
for i in range(1,11):
    name = 'obj_{}'.format(i)
    my_objects[name] = my_objects.get(name, MyClass(name = name))
1 như một lớp Python với hai phương thức. Cả hai phương pháp đều có cùng tên, nhưng chúng có triển khai hơi khác nhau.

Để tìm hiểu những gì xảy ra khi hai phương thức có cùng tên, hãy lưu lớp của bạn vào tệp

class MyClass:
    def __init__(self, name):
        self.name = name
        self.pretty_print_name()

    def pretty_print_name(self):
    print("This object's name is {}.".format(self.name))

my_objects = {}
for i in range(1,11):
    name = 'obj_{}'.format(i)
    my_objects[name] = my_objects.get(name, MyClass(name = name))
2 trong thư mục làm việc của bạn và chạy mã sau trong phiên tương tác:

>>>

obj_1.do_sth()
4

Trong ví dụ này, bạn gọi

class MyClass:
    def __init__(self, name):
        self.name = name
        self.pretty_print_name()

    def pretty_print_name(self):
    print("This object's name is {}.".format(self.name))

my_objects = {}
for i in range(1,11):
    name = 'obj_{}'.format(i)
    my_objects[name] = my_objects.get(name, MyClass(name = name))
3 vào
class MyClass:
    def __init__(self, name):
        self.name = name
        self.pretty_print_name()

    def pretty_print_name(self):
    print("This object's name is {}.".format(self.name))

my_objects = {}
for i in range(1,11):
    name = 'obj_{}'.format(i)
    my_objects[name] = my_objects.get(name, MyClass(name = name))
4, đây là một ví dụ của lớp
class MyClass:
    def __init__(self, name):
        self.name = name
        self.pretty_print_name()

    def pretty_print_name(self):
    print("This object's name is {}.".format(self.name))

my_objects = {}
for i in range(1,11):
    name = 'obj_{}'.format(i)
    my_objects[name] = my_objects.get(name, MyClass(name = name))
1. Bạn nhận được
class MyClass:
    def __init__(self, name):
        self.name = name
        self.pretty_print_name()

    def pretty_print_name(self):
    print("This object's name is {}.".format(self.name))

my_objects = {}
for i in range(1,11):
    name = 'obj_{}'.format(i)
    my_objects[name] = my_objects.get(name, MyClass(name = name))
6 thay vì
class MyClass:
    def __init__(self, name):
        self.name = name
        self.pretty_print_name()

    def pretty_print_name(self):
    print("This object's name is {}.".format(self.name))

my_objects = {}
for i in range(1,11):
    name = 'obj_{}'.format(i)
    my_objects[name] = my_objects.get(name, MyClass(name = name))
7 trên màn hình của mình, điều này xác nhận rằng việc triển khai phương thức thứ hai chiếm ưu thế trong lần đầu tiên.

Dòng mã cuối cùng kiểm tra nội dung của

'awesome red'
9, phát hiện ra rằng tên phương thức,
class MyClass:
    def __init__(self, name):
        self.name = name
        self.pretty_print_name()

    def pretty_print_name(self):
    print("This object's name is {}.".format(self.name))

my_objects = {}
for i in range(1,11):
    name = 'obj_{}'.format(i)
    my_objects[name] = my_objects.get(name, MyClass(name = name))
9, chỉ xuất hiện một lần trong không gian tên lớp. Điều này phù hợp với cách từ điển hoạt động trong Python.

Một cái gì đó tương tự xảy ra với các chức năng trong mô -đun Python và trong một phiên tương tác. Việc triển khai cuối cùng của một số chức năng có cùng tên chiếm ưu thế trong phần còn lại của các triển khai:

>>>

obj_1.do_sth()
5

Trong ví dụ này, bạn gọi

class MyClass:
    def __init__(self, name):
        self.name = name
        self.pretty_print_name()

    def pretty_print_name(self):
    print("This object's name is {}.".format(self.name))

my_objects = {}
for i in range(1,11):
    name = 'obj_{}'.format(i)
    my_objects[name] = my_objects.get(name, MyClass(name = name))
3 vào
class MyClass:
    def __init__(self, name):
        self.name = name
        self.pretty_print_name()

    def pretty_print_name(self):
    print("This object's name is {}.".format(self.name))

my_objects = {}
for i in range(1,11):
    name = 'obj_{}'.format(i)
    my_objects[name] = my_objects.get(name, MyClass(name = name))
4, đây là một ví dụ của lớp
class MyClass:
    def __init__(self, name):
        self.name = name
        self.pretty_print_name()

    def pretty_print_name(self):
    print("This object's name is {}.".format(self.name))

my_objects = {}
for i in range(1,11):
    name = 'obj_{}'.format(i)
    my_objects[name] = my_objects.get(name, MyClass(name = name))
1. Bạn nhận được
class MyClass:
    def __init__(self, name):
        self.name = name
        self.pretty_print_name()

    def pretty_print_name(self):
    print("This object's name is {}.".format(self.name))

my_objects = {}
for i in range(1,11):
    name = 'obj_{}'.format(i)
    my_objects[name] = my_objects.get(name, MyClass(name = name))
6 thay vì
class MyClass:
    def __init__(self, name):
        self.name = name
        self.pretty_print_name()

    def pretty_print_name(self):
    print("This object's name is {}.".format(self.name))

my_objects = {}
for i in range(1,11):
    name = 'obj_{}'.format(i)
    my_objects[name] = my_objects.get(name, MyClass(name = name))
7 trên màn hình của mình, điều này xác nhận rằng việc triển khai phương thức thứ hai chiếm ưu thế trong lần đầu tiên.

Dòng mã cuối cùng kiểm tra nội dung của

'awesome red'
9, phát hiện ra rằng tên phương thức,
class MyClass:
    def __init__(self, name):
        self.name = name
        self.pretty_print_name()

    def pretty_print_name(self):
    print("This object's name is {}.".format(self.name))

my_objects = {}
for i in range(1,11):
    name = 'obj_{}'.format(i)
    my_objects[name] = my_objects.get(name, MyClass(name = name))
9, chỉ xuất hiện một lần trong không gian tên lớp. Điều này phù hợp với cách từ điển hoạt động trong Python.

Một cái gì đó tương tự xảy ra với các chức năng trong mô -đun Python và trong một phiên tương tác. Việc triển khai cuối cùng của một số chức năng có cùng tên chiếm ưu thế trong phần còn lại của các triển khai:

Bạn xác định hai chức năng có cùng tên,

"This object's name is obj_1."
"This object's name is obj_2."
"This object's name is obj_3."
"This object's name is obj_4."
"This object's name is obj_5."
"This object's name is obj_6."
"This object's name is obj_7."
"This object's name is obj_8."
"This object's name is obj_9."
"This object's name is obj_10."
0, trong cùng một phiên phiên dịch. Tuy nhiên, định nghĩa thứ hai ghi đè lên định nghĩa thứ nhất. Khi bạn gọi hàm, bạn sẽ nhận được
class MyClass:
    def __init__(self, name):
        self.name = name
        self.pretty_print_name()

    def pretty_print_name(self):
    print("This object's name is {}.".format(self.name))

my_objects = {}
for i in range(1,11):
    name = 'obj_{}'.format(i)
    my_objects[name] = my_objects.get(name, MyClass(name = name))
6, điều này xác nhận rằng định nghĩa hàm cuối cùng chiếm ưu thế.

Một kỹ thuật khác mà một số ngôn ngữ lập trình sử dụng để cung cấp nhiều cách để gọi một phương thức hoặc hàm là nhiều công văn.

Với kỹ thuật này, bạn có thể viết một số triển khai khác nhau của cùng một phương thức hoặc chức năng và tự động gửi quá trình thực hiện mong muốn theo loại hoặc các đặc điểm khác của các đối số được sử dụng trong cuộc gọi. Bạn có thể sử dụng một vài công cụ từ thư viện tiêu chuẩn để kéo kỹ thuật này vào mã Python của bạn.

Python là một ngôn ngữ khá linh hoạt và giàu tính năng và cung cấp một vài cách để thực hiện nhiều hàm tạo và làm cho các lớp của bạn linh hoạt hơn.optional arguments using default argument values. This way, you can call the class constructor in different ways and get a different behavior each time.

Trong phần sau, bạn sẽ mô phỏng nhiều hàm tạo bằng cách truyền các đối số tùy chọn và bằng cách kiểm tra các loại đối số để xác định các hành vi khác nhau trong các bộ khởi tạo thể hiện của bạn.data type of the arguments to

class MyClass:
   def __init__(self, name):
       self.name = name
       self.checkme = 'awesome {}'.format(self.name)
...

instanceNames = ['red', 'green', 'blue']

# Here you use the dictionary
holder = {name: MyClass(name=name) for name in instanceNames}
4 to provide different behaviors depending on the concrete data type that you pass in the call. This technique allows you to simulate multiple constructors in a class.

Mô phỏng nhiều hàm tạo trong các lớp của bạn

Một kỹ thuật khá hữu ích để mô phỏng nhiều hàm tạo trong lớp Python là cung cấp class MyClass: def __init__(self, name): self.name = name self.checkme = 'awesome {}'.format(self.name) ... instanceNames = ['red', 'green', 'blue'] # Here you use the dictionary holder = {name: MyClass(name=name) for name in instanceNames} 4 với các đối số tùy chọn bằng cách sử dụng các giá trị đối số mặc định. Bằng cách này, bạn có thể gọi hàm tạo lớp theo những cách khác nhau và nhận được một hành vi khác nhau mỗi lần.

Một chiến lược khác là kiểm tra kiểu dữ liệu của các đối số thành

class MyClass:
   def __init__(self, name):
       self.name = name
       self.checkme = 'awesome {}'.format(self.name)
...

instanceNames = ['red', 'green', 'blue']

# Here you use the dictionary
holder = {name: MyClass(name=name) for name in instanceNames}
4 để cung cấp các hành vi khác nhau tùy thuộc vào loại dữ liệu cụ thể mà bạn vượt qua trong cuộc gọi. Kỹ thuật này cho phép bạn mô phỏng nhiều hàm tạo trong một lớp.optional arguments. You can do this by specifying appropriate default argument values.

Trong phần này, bạn sẽ tìm hiểu những điều cơ bản về cách mô phỏng nhiều cách để xây dựng các đối tượng bằng cách cung cấp các giá trị mặc định phù hợp cho các đối số của phương thức

class MyClass:
   def __init__(self, name):
       self.name = name
       self.checkme = 'awesome {}'.format(self.name)
...

instanceNames = ['red', 'green', 'blue']

# Here you use the dictionary
holder = {name: MyClass(name=name) for name in instanceNames}
4 và cũng bằng cách kiểm tra loại dữ liệu của các đối số cho phương thức này. Cả hai phương pháp chỉ yêu cầu một triển khai
class MyClass:
   def __init__(self, name):
       self.name = name
       self.checkme = 'awesome {}'.format(self.name)
...

instanceNames = ['red', 'green', 'blue']

# Here you use the dictionary
holder = {name: MyClass(name=name) for name in instanceNames}
4.

Sử dụng các giá trị đối số tùy chọn trong

class MyClass:
   def __init__(self, name):
       self.name = name
       self.checkme = 'awesome {}'.format(self.name)
...

instanceNames = ['red', 'green', 'blue']

# Here you use the dictionary
holder = {name: MyClass(name=name) for name in instanceNames}
4

obj_1.do_sth()
6

Một cách thanh lịch và pythonic để mô phỏng nhiều hàm tạo là thực hiện phương pháp

class MyClass:
   def __init__(self, name):
       self.name = name
       self.checkme = 'awesome {}'.format(self.name)
...

instanceNames = ['red', 'green', 'blue']

# Here you use the dictionary
holder = {name: MyClass(name=name) for name in instanceNames}
4 với các đối số tùy chọn. Bạn có thể làm điều này bằng cách chỉ định các giá trị đối số mặc định phù hợp.

Biểu tượng sao hoặc dấu hoa thị (

class Try:
    def do_somthing(self):
        print 'Hello'

if __name__ == '__main__':
    obj_list = []
    for obj in range(10):
        obj = Try()
        obj_list.append(obj)

    obj_list[0].do_somthing()
5) sau
class Try:
    def do_somthing(self):
        print 'Hello'

if __name__ == '__main__':
    obj_list = []
    for obj in range(10):
        obj = Try()
        obj_list.append(obj)

    obj_list[0].do_somthing()
2 có nghĩa là
class Try:
    def do_somthing(self):
        print 'Hello'

if __name__ == '__main__':
    obj_list = []
    for obj in range(10):
        obj = Try()
        obj_list.append(obj)

    obj_list[0].do_somthing()
3 là một đối số chỉ dành cho từ khóa. Để chuyển một giá trị cho một đối số chỉ từ khóa, bạn cần sử dụng tên đối số một cách rõ ràng. Nói cách khác, để đặt
class Try:
    def do_somthing(self):
        print 'Hello'

if __name__ == '__main__':
    obj_list = []
    for obj in range(10):
        obj = Try()
        obj_list.append(obj)

    obj_list[0].do_somthing()
8 thành
class Try:
    def do_somthing(self):
        print 'Hello'

if __name__ == '__main__':
    obj_list = []
    for obj in range(10):
        obj = Try()
        obj_list.append(obj)

    obj_list[0].do_somthing()
9, bạn cần gõ rõ ràng
obj_1.do_sth()
00.

Đối số

class Try:
    def do_somthing(self):
        print 'Hello'

if __name__ == '__main__':
    obj_list = []
    for obj in range(10):
        obj = Try()
        obj_list.append(obj)

    obj_list[0].do_somthing()
3 giữ giá trị ban đầu để tính tổng công suất tích lũy. Nó mặc định là
obj_1.do_sth()
02, là giá trị thích hợp cho những trường hợp mà bạn không có giá trị được tính toán trước đây để khởi tạo tổng công suất tích lũy.

Phương pháp đặc biệt

obj_1.do_sth()
03 biến các phiên bản của
"This object's name is obj_1."
"This object's name is obj_2."
"This object's name is obj_3."
"This object's name is obj_4."
"This object's name is obj_5."
"This object's name is obj_6."
"This object's name is obj_7."
"This object's name is obj_8."
"This object's name is obj_9."
"This object's name is obj_10."
8 thành các đối tượng có thể gọi được. Nói cách khác, bạn có thể gọi các phiên bản của
"This object's name is obj_1."
"This object's name is obj_2."
"This object's name is obj_3."
"This object's name is obj_4."
"This object's name is obj_5."
"This object's name is obj_6."
"This object's name is obj_7."
"This object's name is obj_8."
"This object's name is obj_9."
"This object's name is obj_10."
8 như bạn gọi bất kỳ chức năng chính quy nào.callable objects. In other words, you can call the instances of
"This object's name is obj_1."
"This object's name is obj_2."
"This object's name is obj_3."
"This object's name is obj_4."
"This object's name is obj_5."
"This object's name is obj_6."
"This object's name is obj_7."
"This object's name is obj_8."
"This object's name is obj_9."
"This object's name is obj_10."
8 like you call any regular function.

Bên trong

obj_1.do_sth()
03, trước tiên bạn tính toán sức mạnh của
obj_1.do_sth()
07 được nâng lên
class Try:
    def do_somthing(self):
        print 'Hello'

if __name__ == '__main__':
    obj_list = []
    for obj in range(10):
        obj = Try()
        obj_list.append(obj)

    obj_list[0].do_somthing()
2. Sau đó, bạn thêm giá trị kết quả vào giá trị hiện tại của
obj_1.do_sth()
09. Cuối cùng, bạn trả lại sức mạnh được tính toán.

Để thử

"This object's name is obj_1."
"This object's name is obj_2."
"This object's name is obj_3."
"This object's name is obj_4."
"This object's name is obj_5."
"This object's name is obj_6."
"This object's name is obj_7."
"This object's name is obj_8."
"This object's name is obj_9."
"This object's name is obj_10."
8, hãy mở một phiên tương tác Python trong thư mục chứa
"This object's name is obj_1."
"This object's name is obj_2."
"This object's name is obj_3."
"This object's name is obj_4."
"This object's name is obj_5."
"This object's name is obj_6."
"This object's name is obj_7."
"This object's name is obj_8."
"This object's name is obj_9."
"This object's name is obj_10."
9 và chạy mã sau:

>>>

obj_1.do_sth()
7

Những ví dụ này cho thấy cách

"This object's name is obj_1."
"This object's name is obj_2."
"This object's name is obj_3."
"This object's name is obj_4."
"This object's name is obj_5."
"This object's name is obj_6."
"This object's name is obj_7."
"This object's name is obj_8."
"This object's name is obj_9."
"This object's name is obj_10."
8 mô phỏng nhiều hàm tạo. Ví dụ, hàm tạo đầu tiên không có đối số. Nó cho phép bạn tạo các phiên bản lớp tính toán quyền hạn của
class Try:
    def do_somthing(self):
        print 'Hello'

if __name__ == '__main__':
    obj_list = []
    for obj in range(10):
        obj = Try()
        obj_list.append(obj)

    obj_list[0].do_somthing()
4, đây là giá trị mặc định của đối số
class Try:
    def do_somthing(self):
        print 'Hello'

if __name__ == '__main__':
    obj_list = []
    for obj in range(10):
        obj = Try()
        obj_list.append(obj)

    obj_list[0].do_somthing()
2. Thuộc tính thể hiện ____109 chứa tổng tích lũy của các quyền hạn được tính toán khi bạn đi.

Ví dụ thứ hai cho thấy một hàm tạo lấy

class Try:
    def do_somthing(self):
        print 'Hello'

if __name__ == '__main__':
    obj_list = []
    for obj in range(10):
        obj = Try()
        obj_list.append(obj)

    obj_list[0].do_somthing()
2 làm đối số và trả về một thể hiện có thể gọi được tính toán các khối. Trong trường hợp này,
obj_1.do_sth()
09 hoạt động giống như trong ví dụ đầu tiên.

Ví dụ thứ ba cho thấy cách

"This object's name is obj_1."
"This object's name is obj_2."
"This object's name is obj_3."
"This object's name is obj_4."
"This object's name is obj_5."
"This object's name is obj_6."
"This object's name is obj_7."
"This object's name is obj_8."
"This object's name is obj_9."
"This object's name is obj_10."
8 dường như có một hàm tạo khác cho phép bạn tạo các phiên bản bằng cách cung cấp các đối số
class Try:
    def do_somthing(self):
        print 'Hello'

if __name__ == '__main__':
    obj_list = []
    for obj in range(10):
        obj = Try()
        obj_list.append(obj)

    obj_list[0].do_somthing()
2 và
class Try:
    def do_somthing(self):
        print 'Hello'

if __name__ == '__main__':
    obj_list = []
    for obj in range(10):
        obj = Try()
        obj_list.append(obj)

    obj_list[0].do_somthing()
3. Bây giờ
obj_1.do_sth()
09 bắt đầu với giá trị
obj_1.do_sth()
22, khởi tạo tổng sức mạnh.

Sử dụng các đối số tùy chọn khi bạn thực hiện

class MyClass:
   def __init__(self, name):
       self.name = name
       self.checkme = 'awesome {}'.format(self.name)
...

instanceNames = ['red', 'green', 'blue']

# Here you use the dictionary
holder = {name: MyClass(name=name) for name in instanceNames}
4 trong các lớp của bạn là một kỹ thuật sạch và pythonic để tạo ra các lớp mô phỏng nhiều hàm tạo.

Kiểm tra các loại đối số trong class MyClass: def __init__(self, name): self.name = name self.checkme = 'awesome {}'.format(self.name) ... instanceNames = ['red', 'green', 'blue'] # Here you use the dictionary holder = {name: MyClass(name=name) for name in instanceNames} 4

Một cách tiếp cận khác để mô phỏng nhiều hàm tạo là viết một phương thức

class MyClass:
   def __init__(self, name):
       self.name = name
       self.checkme = 'awesome {}'.format(self.name)
...

instanceNames = ['red', 'green', 'blue']

# Here you use the dictionary
holder = {name: MyClass(name=name) for name in instanceNames}
4 hoạt động khác nhau tùy thuộc vào loại đối số. Để kiểm tra loại biến trong Python, bạn thường dựa vào hàm
obj_1.do_sth()
26 tích hợp. Hàm này trả về
obj_1.do_sth()
27 Nếu một đối tượng là một thể hiện của một lớp đã cho và
obj_1.do_sth()
28 nếu không:

>>>

obj_1.do_sth()
8

Những ví dụ này cho thấy cách

"This object's name is obj_1."
"This object's name is obj_2."
"This object's name is obj_3."
"This object's name is obj_4."
"This object's name is obj_5."
"This object's name is obj_6."
"This object's name is obj_7."
"This object's name is obj_8."
"This object's name is obj_9."
"This object's name is obj_10."
8 mô phỏng nhiều hàm tạo. Ví dụ, hàm tạo đầu tiên không có đối số. Nó cho phép bạn tạo các phiên bản lớp tính toán quyền hạn của
class Try:
    def do_somthing(self):
        print 'Hello'

if __name__ == '__main__':
    obj_list = []
    for obj in range(10):
        obj = Try()
        obj_list.append(obj)

    obj_list[0].do_somthing()
4, đây là giá trị mặc định của đối số
class Try:
    def do_somthing(self):
        print 'Hello'

if __name__ == '__main__':
    obj_list = []
    for obj in range(10):
        obj = Try()
        obj_list.append(obj)

    obj_list[0].do_somthing()
2. Thuộc tính thể hiện ____109 chứa tổng tích lũy của các quyền hạn được tính toán khi bạn đi.

Ví dụ thứ hai cho thấy một hàm tạo lấy

class Try:
    def do_somthing(self):
        print 'Hello'

if __name__ == '__main__':
    obj_list = []
    for obj in range(10):
        obj = Try()
        obj_list.append(obj)

    obj_list[0].do_somthing()
2 làm đối số và trả về một thể hiện có thể gọi được tính toán các khối. Trong trường hợp này,
obj_1.do_sth()
09 hoạt động giống như trong ví dụ đầu tiên.

>>>

obj_1.do_sth()
9

Những ví dụ này cho thấy cách

"This object's name is obj_1."
"This object's name is obj_2."
"This object's name is obj_3."
"This object's name is obj_4."
"This object's name is obj_5."
"This object's name is obj_6."
"This object's name is obj_7."
"This object's name is obj_8."
"This object's name is obj_9."
"This object's name is obj_10."
8 mô phỏng nhiều hàm tạo. Ví dụ, hàm tạo đầu tiên không có đối số. Nó cho phép bạn tạo các phiên bản lớp tính toán quyền hạn của
class Try:
    def do_somthing(self):
        print 'Hello'

if __name__ == '__main__':
    obj_list = []
    for obj in range(10):
        obj = Try()
        obj_list.append(obj)

    obj_list[0].do_somthing()
4, đây là giá trị mặc định của đối số
class Try:
    def do_somthing(self):
        print 'Hello'

if __name__ == '__main__':
    obj_list = []
    for obj in range(10):
        obj = Try()
        obj_list.append(obj)

    obj_list[0].do_somthing()
2. Thuộc tính thể hiện ____109 chứa tổng tích lũy của các quyền hạn được tính toán khi bạn đi.

Ví dụ thứ hai cho thấy một hàm tạo lấy

class Try:
    def do_somthing(self):
        print 'Hello'

if __name__ == '__main__':
    obj_list = []
    for obj in range(10):
        obj = Try()
        obj_list.append(obj)

    obj_list[0].do_somthing()
2 làm đối số và trả về một thể hiện có thể gọi được tính toán các khối. Trong trường hợp này,
obj_1.do_sth()
09 hoạt động giống như trong ví dụ đầu tiên.

Ví dụ thứ ba cho thấy cách

"This object's name is obj_1."
"This object's name is obj_2."
"This object's name is obj_3."
"This object's name is obj_4."
"This object's name is obj_5."
"This object's name is obj_6."
"This object's name is obj_7."
"This object's name is obj_8."
"This object's name is obj_9."
"This object's name is obj_10."
8 dường như có một hàm tạo khác cho phép bạn tạo các phiên bản bằng cách cung cấp các đối số
class Try:
    def do_somthing(self):
        print 'Hello'

if __name__ == '__main__':
    obj_list = []
    for obj in range(10):
        obj = Try()
        obj_list.append(obj)

    obj_list[0].do_somthing()
2 và
class Try:
    def do_somthing(self):
        print 'Hello'

if __name__ == '__main__':
    obj_list = []
    for obj in range(10):
        obj = Try()
        obj_list.append(obj)

    obj_list[0].do_somthing()
3. Bây giờ
obj_1.do_sth()
09 bắt đầu với giá trị
obj_1.do_sth()
22, khởi tạo tổng sức mạnh.

Sử dụng các đối số tùy chọn khi bạn thực hiện

class MyClass:
   def __init__(self, name):
       self.name = name
       self.checkme = 'awesome {}'.format(self.name)
...

instanceNames = ['red', 'green', 'blue']

# Here you use the dictionary
holder = {name: MyClass(name=name) for name in instanceNames}
4 trong các lớp của bạn là một kỹ thuật sạch và pythonic để tạo ra các lớp mô phỏng nhiều hàm tạo.

Kiểm tra các loại đối số trong

class MyClass:
   def __init__(self, name):
       self.name = name
       self.checkme = 'awesome {}'.format(self.name)
...

instanceNames = ['red', 'green', 'blue']

# Here you use the dictionary
holder = {name: MyClass(name=name) for name in instanceNames}
4

>>>

objs = [MyClass() for i in range(10)]
for obj in objs:
    other_object.add(obj)

objs[0].do_sth()
0

Những ví dụ này cho thấy cách

"This object's name is obj_1."
"This object's name is obj_2."
"This object's name is obj_3."
"This object's name is obj_4."
"This object's name is obj_5."
"This object's name is obj_6."
"This object's name is obj_7."
"This object's name is obj_8."
"This object's name is obj_9."
"This object's name is obj_10."
8 mô phỏng nhiều hàm tạo. Ví dụ, hàm tạo đầu tiên không có đối số. Nó cho phép bạn tạo các phiên bản lớp tính toán quyền hạn của
class Try:
    def do_somthing(self):
        print 'Hello'

if __name__ == '__main__':
    obj_list = []
    for obj in range(10):
        obj = Try()
        obj_list.append(obj)

    obj_list[0].do_somthing()
4, đây là giá trị mặc định của đối số
class Try:
    def do_somthing(self):
        print 'Hello'

if __name__ == '__main__':
    obj_list = []
    for obj in range(10):
        obj = Try()
        obj_list.append(obj)

    obj_list[0].do_somthing()
2. Thuộc tính thể hiện ____109 chứa tổng tích lũy của các quyền hạn được tính toán khi bạn đi.

Ví dụ thứ hai cho thấy một hàm tạo lấy

class Try:
    def do_somthing(self):
        print 'Hello'

if __name__ == '__main__':
    obj_list = []
    for obj in range(10):
        obj = Try()
        obj_list.append(obj)

    obj_list[0].do_somthing()
2 làm đối số và trả về một thể hiện có thể gọi được tính toán các khối. Trong trường hợp này,
obj_1.do_sth()
09 hoạt động giống như trong ví dụ đầu tiên.unsupported date formats:

>>>

objs = [MyClass() for i in range(10)]
for obj in objs:
    other_object.add(obj)

objs[0].do_sth()
1

Trong ví dụ này, mệnh đề

obj_1.do_sth()
50 chạy nếu giá trị của
obj_1.do_sth()
39 không phải là đối tượng
obj_1.do_sth()
32 hoặc một chuỗi giữ một ngày ISO hợp lệ. Bằng cách này, tình huống đặc biệt không vượt qua âm thầm.

Cung cấp nhiều hàm tạo với class MyClass: def __init__(self, name): self.name = name self.checkme = 'awesome {}'.format(self.name) ... instanceNames = ['red', 'green', 'blue'] # Here you use the dictionary holder = {name: MyClass(name=name) for name in instanceNames} 0 trong Python

Một kỹ thuật mạnh mẽ để cung cấp nhiều hàm tạo trong Python là sử dụng

class MyClass:
   def __init__(self, name):
       self.name = name
       self.checkme = 'awesome {}'.format(self.name)
...

instanceNames = ['red', 'green', 'blue']

# Here you use the dictionary
holder = {name: MyClass(name=name) for name in instanceNames}
0. Bộ trang trí này cho phép bạn biến một phương pháp thông thường thành phương pháp lớp.class method.

Không giống như các phương pháp thông thường, các phương thức lớp don don lấy ví dụ hiện tại,

class MyClass:
   def __init__(self, name):
       self.name = name
       self.checkme = 'awesome {}'.format(self.name)
...

instanceNames = ['red', 'green', 'blue']

# Here you use the dictionary
holder = {name: MyClass(name=name) for name in instanceNames}
7, như một đối số. Thay vào đó, họ tự mình tham gia lớp học, thường được thông qua như đối số
obj_1.do_sth()
57. Sử dụng
obj_1.do_sth()
57 để đặt tên cho đối số này là một quy ước phổ biến trong cộng đồng Python.

Ở đây, cú pháp cơ bản để xác định phương pháp lớp:

>>>

objs = [MyClass() for i in range(10)]
for obj in objs:
    other_object.add(obj)

objs[0].do_sth()
2

obj_1.do_sth()
59 Xác định một phương pháp lớp sử dụng trình trang trí
class MyClass:
   def __init__(self, name):
       self.name = name
       self.checkme = 'awesome {}'.format(self.name)
...

instanceNames = ['red', 'green', 'blue']

# Here you use the dictionary
holder = {name: MyClass(name=name) for name in instanceNames}
0 tích hợp Python. Đối số đầu tiên của
obj_1.do_sth()
61 giữ bản thân lớp. Thông qua lập luận này, bạn có thể truy cập lớp từ bên trong chính nó. Trong ví dụ này, bạn truy cập thuộc tính
obj_1.do_sth()
62, lưu trữ tên của lớp bên dưới dưới dạng chuỗi.

Điều quan trọng cần lưu ý là bạn có thể truy cập một phương thức lớp bằng cách sử dụng lớp hoặc một thể hiện cụ thể của lớp trong tay. Bất kể bạn gọi

obj_1.do_sth()
61 như thế nào, nó sẽ nhận được
obj_1.do_sth()
59 làm đối số đầu tiên của nó. Lý do cuối cùng tại sao bạn có thể sử dụng các phương thức lớp như các hàm tạo là vì bạn không cần một ví dụ để gọi một phương thức lớp.

Sử dụng

class MyClass:
   def __init__(self, name):
       self.name = name
       self.checkme = 'awesome {}'.format(self.name)
...

instanceNames = ['red', 'green', 'blue']

# Here you use the dictionary
holder = {name: MyClass(name=name) for name in instanceNames}
0 giúp có thể thêm nhiều hàm tạo rõ ràng như bạn cần vào một lớp nhất định. Nó là một cách pythonic và phổ biến để thực hiện nhiều hàm tạo. Bạn cũng có thể gọi loại nhà xây dựng này là một hàm tạo thay thế trong Python, như Raymond Hettinger làm trong bộ công cụ phát triển lớp Pycon Talk Python của anh ấy.alternative constructor in Python, as Raymond Hettinger does in his PyCon talk Python’s Class Development Toolkit.

Bây giờ, làm thế nào bạn có thể sử dụng một phương thức lớp để tùy chỉnh quá trình khởi tạo Python? Thay vì tinh chỉnh

class MyClass:
   def __init__(self, name):
       self.name = name
       self.checkme = 'awesome {}'.format(self.name)
...

instanceNames = ['red', 'green', 'blue']

# Here you use the dictionary
holder = {name: MyClass(name=name) for name in instanceNames}
4 và khởi tạo đối tượng, bạn sẽ kiểm soát cả hai bước: tạo và khởi tạo đối tượng. Thông qua các ví dụ sau, bạn sẽ học cách làm điều đó.

Xây dựng một vòng tròn từ đường kính của nó

Để tạo hàm tạo lớp đầu tiên của bạn với

class MyClass:
   def __init__(self, name):
       self.name = name
       self.checkme = 'awesome {}'.format(self.name)
...

instanceNames = ['red', 'green', 'blue']

# Here you use the dictionary
holder = {name: MyClass(name=name) for name in instanceNames}
0, hãy nói rằng bạn đang mã hóa một ứng dụng liên quan đến hình học và cần một lớp
obj_1.do_sth()
68. Ban đầu, bạn xác định lớp của mình như sau:

objs = [MyClass() for i in range(10)]
for obj in objs:
    other_object.add(obj)

objs[0].do_sth()
3

Bộ khởi tạo của

obj_1.do_sth()
68 lấy giá trị bán kính làm đối số và lưu trữ nó trong một thuộc tính thể hiện có tên là
obj_1.do_sth()
70. Sau đó, lớp thực hiện các phương pháp để tính toán khu vực vòng tròn và chu vi bằng cách sử dụng mô -đun Python, ____ ____171. Phương pháp đặc biệt
obj_1.do_sth()
72 trả về một biểu diễn chuỗi phù hợp cho lớp của bạn.string representation for your class.

Hãy tiếp tục và tạo tệp

obj_1.do_sth()
73 trong thư mục làm việc của bạn. Sau đó mở trình thông dịch Python và chạy mã sau để dùng thử
obj_1.do_sth()
68:

>>>

objs = [MyClass() for i in range(10)]
for obj in objs:
    other_object.add(obj)

objs[0].do_sth()
4

Mát mẻ! Lớp học của bạn hoạt động chính xác! Bây giờ nói rằng bạn cũng muốn khởi tạo

obj_1.do_sth()
68 bằng đường kính. Bạn có thể làm một cái gì đó như
obj_1.do_sth()
76, nhưng điều đó không hoàn toàn pythonic hoặc trực quan. Nó tốt hơn để có một hàm tạo thay thế để tạo vòng tròn bằng cách sử dụng trực tiếp đường kính của chúng.

Đi trước và thêm phương thức lớp sau vào

obj_1.do_sth()
68 ngay sau
class MyClass:
   def __init__(self, name):
       self.name = name
       self.checkme = 'awesome {}'.format(self.name)
...

instanceNames = ['red', 'green', 'blue']

# Here you use the dictionary
holder = {name: MyClass(name=name) for name in instanceNames}
4:

objs = [MyClass() for i in range(10)]
for obj in objs:
    other_object.add(obj)

objs[0].do_sth()
5

Ở đây, bạn định nghĩa

obj_1.do_sth()
79 là một phương thức lớp. Đối số đầu tiên của nó nhận được một tham chiếu đến lớp chứa,
obj_1.do_sth()
68.

Đối số thứ hai giữ đường kính của vòng tròn cụ thể mà bạn muốn tạo. Bên trong phương thức, trước tiên bạn tính toán bán kính bằng cách sử dụng giá trị đầu vào của

obj_1.do_sth()
81. Sau đó, bạn khởi tạo
obj_1.do_sth()
68 bằng cách gọi
obj_1.do_sth()
57 với bán kính xuất phát từ đối số
obj_1.do_sth()
81.

Bằng cách này, bạn có thể kiểm soát hoàn toàn việc tạo và khởi tạo các trường hợp của

obj_1.do_sth()
68 bằng cách sử dụng đường kính làm đối số.

Cuộc gọi đến đối số

obj_1.do_sth()
57 tự động chạy các bước tạo và khởi tạo đối tượng mà Python cần để khởi tạo một lớp. Cuối cùng,
obj_1.do_sth()
79 trả về thể hiện mới cho người gọi.

Tại đây, cách bạn có thể sử dụng hàm tạo hoàn toàn mới của mình để tạo vòng tròn bằng cách sử dụng đường kính:

>>>

objs = [MyClass() for i in range(10)]
for obj in objs:
    other_object.add(obj)

objs[0].do_sth()
6

Cuộc gọi đến

obj_1.do_sth()
79 trên
obj_1.do_sth()
68 trả về một thể hiện mới của lớp. Để xây dựng thể hiện đó, phương thức sử dụng đường kính thay vì bán kính. Lưu ý rằng phần còn lại của chức năng của
obj_1.do_sth()
68 hoạt động giống như trước đây.

Sử dụng

class MyClass:
   def __init__(self, name):
       self.name = name
       self.checkme = 'awesome {}'.format(self.name)
...

instanceNames = ['red', 'green', 'blue']

# Here you use the dictionary
holder = {name: MyClass(name=name) for name in instanceNames}
0 như bạn đã làm trong ví dụ trên là cách phổ biến nhất để cung cấp nhiều hàm tạo rõ ràng trong các lớp của bạn. Với kỹ thuật này, bạn có tùy chọn để chọn đúng tên cho từng hàm tạo thay thế mà bạn cung cấp, có thể làm cho mã của bạn dễ đọc và duy trì hơn.

Xây dựng điểm cực từ tọa độ Cartesian

Để biết một ví dụ phức tạp hơn về việc cung cấp nhiều hàm tạo bằng các phương thức lớp, giả sử bạn có một lớp đại diện cho một điểm cực trong một ứng dụng liên quan đến toán học. Bạn cần một cách để làm cho lớp học của bạn linh hoạt hơn để bạn có thể xây dựng các trường hợp mới bằng các tọa độ Cartesian.

Tại đây, cách bạn có thể viết một hàm tạo để đáp ứng yêu cầu này:

objs = [MyClass() for i in range(10)]
for obj in objs:
    other_object.add(obj)

objs[0].do_sth()
7

Trong ví dụ này,

obj_1.do_sth()
92 có hai đối số đại diện cho một điểm nhất định ____ ____193 và
obj_1.do_sth()
94 tọa độ Cartesian. Sau đó, phương pháp tính toán yêu cầu
obj_1.do_sth()
95 và
obj_1.do_sth()
96 để xây dựng đối tượng
obj_1.do_sth()
97 tương ứng. Cuối cùng,
obj_1.do_sth()
92 trả về một thể hiện mới của lớp.

Ở đây, cách thức hoạt động của lớp, sử dụng cả hai hệ tọa độ:

>>>

objs = [MyClass() for i in range(10)]
for obj in objs:
    other_object.add(obj)

objs[0].do_sth()
8

Trong các ví dụ này, bạn sử dụng quy trình khởi tạo tiêu chuẩn và hàm tạo thay thế của bạn,

obj_1.do_sth()
92, để tạo các trường hợp
obj_1.do_sth()
97 bằng cách sử dụng các đối số khởi tạo khác nhau về mặt khái niệm.

Khám phá nhiều hàm tạo trong các lớp Python hiện có

Sử dụng trình trang trí

class MyClass:
   def __init__(self, name):
       self.name = name
       self.checkme = 'awesome {}'.format(self.name)
...

instanceNames = ['red', 'green', 'blue']

# Here you use the dictionary
holder = {name: MyClass(name=name) for name in instanceNames}
0 để cung cấp nhiều hàm tạo trong một lớp là một kỹ thuật khá phổ biến trong Python. Có một số ví dụ về các lớp thư viện tiêu chuẩn và tích hợp sử dụng kỹ thuật này để cung cấp nhiều hàm tạo thay thế.

Trong phần này, bạn sẽ tìm hiểu về ba trong số các ví dụ đáng chú ý nhất của các lớp này:

objs = [MyClass() for i in range(10)]
for obj in objs:
    other_object.add(obj)

objs[0].do_sth()
02,
objs = [MyClass() for i in range(10)]
for obj in objs:
    other_object.add(obj)

objs[0].do_sth()
03 và
objs = [MyClass() for i in range(10)]
for obj in objs:
    other_object.add(obj)

objs[0].do_sth()
04.

Xây dựng từ điển từ các khóa

Từ điển là một loại dữ liệu cơ bản trong Python. Họ có mặt trong mỗi đoạn mã Python, rõ ràng hoặc ngầm. Họ cũng là một nền tảng của chính ngôn ngữ bởi vì các phần quan trọng của việc triển khai Cpython dựa vào chúng.

Bạn có một số cách để xác định các trường hợp từ điển trong Python. Bạn có thể sử dụng các chữ từ điển, bao gồm các cặp giá trị khóa trong ngoặc xoăn (

objs = [MyClass() for i in range(10)]
for obj in objs:
    other_object.add(obj)

objs[0].do_sth()
05). Bạn cũng có thể gọi
objs = [MyClass() for i in range(10)]
for obj in objs:
    other_object.add(obj)

objs[0].do_sth()
06 một cách rõ ràng với các đối số từ khóa hoặc với một chuỗi các bộ dữ liệu hai mục chẳng hạn.

Lớp phổ biến này cũng thực hiện một hàm tạo thay thế được gọi là

objs = [MyClass() for i in range(10)]
for obj in objs:
    other_object.add(obj)

objs[0].do_sth()
07. Phương pháp lớp này có một
objs = [MyClass() for i in range(10)]
for obj in objs:
    other_object.add(obj)

objs[0].do_sth()
08 của các khóa và một
class Try:
    def do_somthing(self):
        print 'Hello'

if __name__ == '__main__':
    obj_list = []
    for obj in range(10):
        obj = Try()
        obj_list.append(obj)

    obj_list[0].do_somthing()
9 tùy chọn. Đối số
class Try:
    def do_somthing(self):
        print 'Hello'

if __name__ == '__main__':
    obj_list = []
    for obj in range(10):
        obj = Try()
        obj_list.append(obj)

    obj_list[0].do_somthing()
9 mặc định là
objs = [MyClass() for i in range(10)]
for obj in objs:
    other_object.add(obj)

objs[0].do_sth()
11 và hoạt động như giá trị cho tất cả các khóa trong từ điển kết quả.

Bây giờ, làm thế nào

objs = [MyClass() for i in range(10)]
for obj in objs:
    other_object.add(obj)

objs[0].do_sth()
07 có thể hữu ích trong mã của bạn? Giả sử bạn đang điều hành một nơi trú ẩn động vật và bạn cần xây dựng một ứng dụng nhỏ để theo dõi xem có bao nhiêu động vật hiện đang sống trong nơi trú ẩn của bạn. Ứng dụng của bạn sử dụng từ điển để lưu trữ hàng tồn kho của động vật.

Bởi vì bạn đã biết loài nào bạn có khả năng nhà ở tại nơi trú ẩn, bạn có thể tạo từ điển hàng tồn kho ban đầu một cách linh hoạt, như trong đoạn mã sau:

>>>

objs = [MyClass() for i in range(10)]
for obj in objs:
    other_object.add(obj)

objs[0].do_sth()
9

Trong các ví dụ này, bạn sử dụng quy trình khởi tạo tiêu chuẩn và hàm tạo thay thế của bạn,

obj_1.do_sth()
92, để tạo các trường hợp
obj_1.do_sth()
97 bằng cách sử dụng các đối số khởi tạo khác nhau về mặt khái niệm.

Khám phá nhiều hàm tạo trong các lớp Python hiện có

Sử dụng trình trang trí

class MyClass:
   def __init__(self, name):
       self.name = name
       self.checkme = 'awesome {}'.format(self.name)
...

instanceNames = ['red', 'green', 'blue']

# Here you use the dictionary
holder = {name: MyClass(name=name) for name in instanceNames}
0 để cung cấp nhiều hàm tạo trong một lớp là một kỹ thuật khá phổ biến trong Python. Có một số ví dụ về các lớp thư viện tiêu chuẩn và tích hợp sử dụng kỹ thuật này để cung cấp nhiều hàm tạo thay thế.

objs = list()
for i in range(10):
    objs.append(MyClass())
0

Trong phần này, bạn sẽ tìm hiểu về ba trong số các ví dụ đáng chú ý nhất của các lớp này:

objs = [MyClass() for i in range(10)]
for obj in objs:
    other_object.add(obj)

objs[0].do_sth()
02,
objs = [MyClass() for i in range(10)]
for obj in objs:
    other_object.add(obj)

objs[0].do_sth()
03 và
objs = [MyClass() for i in range(10)]
for obj in objs:
    other_object.add(obj)

objs[0].do_sth()
04.

Xây dựng từ điển từ các khóa

Từ điển là một loại dữ liệu cơ bản trong Python. Họ có mặt trong mỗi đoạn mã Python, rõ ràng hoặc ngầm. Họ cũng là một nền tảng của chính ngôn ngữ bởi vì các phần quan trọng của việc triển khai Cpython dựa vào chúng.

Bạn có một số cách để xác định các trường hợp từ điển trong Python. Bạn có thể sử dụng các chữ từ điển, bao gồm các cặp giá trị khóa trong ngoặc xoăn (

objs = [MyClass() for i in range(10)]
for obj in objs:
    other_object.add(obj)

objs[0].do_sth()
05). Bạn cũng có thể gọi
objs = [MyClass() for i in range(10)]
for obj in objs:
    other_object.add(obj)

objs[0].do_sth()
06 một cách rõ ràng với các đối số từ khóa hoặc với một chuỗi các bộ dữ liệu hai mục chẳng hạn.

>>>

objs = list()
for i in range(10):
    objs.append(MyClass())
1

Trong các ví dụ này, bạn sử dụng quy trình khởi tạo tiêu chuẩn và hàm tạo thay thế của bạn,

obj_1.do_sth()
92, để tạo các trường hợp
obj_1.do_sth()
97 bằng cách sử dụng các đối số khởi tạo khác nhau về mặt khái niệm.

Khám phá nhiều hàm tạo trong các lớp Python hiện có

Tìm con đường của bạn về nhà

Mô -đun Python từ

objs = [MyClass() for i in range(10)]
for obj in objs:
    other_object.add(obj)

objs[0].do_sth()
44 từ thư viện tiêu chuẩn cung cấp các công cụ tiện lợi và hiện đại để xử lý các đường dẫn hệ thống trong mã của bạn. Nếu bạn không bao giờ sử dụng mô -đun này, thì hãy xem mô -đun Python 3 Pathlib: Tâm hệ thống tệp.

Công cụ đẹp nhất trong

objs = [MyClass() for i in range(10)]
for obj in objs:
    other_object.add(obj)

objs[0].do_sth()
44 là lớp
objs = [MyClass() for i in range(10)]
for obj in objs:
    other_object.add(obj)

objs[0].do_sth()
46 của nó. Lớp này cho phép bạn xử lý đường dẫn hệ thống của mình theo cách đa nền tảng.
objs = [MyClass() for i in range(10)]
for obj in objs:
    other_object.add(obj)

objs[0].do_sth()
46 là một lớp thư viện tiêu chuẩn khác cung cấp nhiều hàm tạo. Ví dụ: bạn sẽ tìm thấy
objs = [MyClass() for i in range(10)]
for obj in objs:
    other_object.add(obj)

objs[0].do_sth()
48, tạo ra một đối tượng đường dẫn từ thư mục nhà của bạn:

  • các cửa sổ
  • Linux + MacOS

>>>

objs = list()
for i in range(10):
    objs.append(MyClass())
2

>>>

objs = list()
for i in range(10):
    objs.append(MyClass())
3

Trình xây dựng

objs = [MyClass() for i in range(10)]
for obj in objs:
    other_object.add(obj)

objs[0].do_sth()
49 trả về một đối tượng đường dẫn mới đại diện cho thư mục nhà của người dùng. Trình xây dựng thay thế này có thể hữu ích khi bạn xử lý các tệp cấu hình trong các ứng dụng và dự án Python của bạn.

Cuối cùng,

objs = [MyClass() for i in range(10)]
for obj in objs:
    other_object.add(obj)

objs[0].do_sth()
46 cũng cung cấp một hàm tạo gọi là
objs = [MyClass() for i in range(10)]
for obj in objs:
    other_object.add(obj)

objs[0].do_sth()
51. Phương pháp này tạo ra một đối tượng đường dẫn từ thư mục làm việc hiện tại của bạn. Hãy tiếp tục và thử nó!

Cung cấp nhiều hàm tạo với class MyClass: def __init__(self, name): self.name = name self.checkme = 'awesome {}'.format(self.name) ... instanceNames = ['red', 'green', 'blue'] # Here you use the dictionary holder = {name: MyClass(name=name) for name in instanceNames} 1

Kỹ thuật cuối cùng mà bạn sẽ học được được gọi là các hàm chung đơn. Với kỹ thuật này, bạn có thể thêm nhiều hàm tạo vào các lớp của mình và chạy chúng một cách chọn lọc, theo loại đối số đầu tiên của họ.

Chức năng chung chung đơn bao gồm nhiều chức năng thực hiện cùng một hoạt động cho các loại dữ liệu khác nhau. Thuật toán công văn cơ bản xác định việc thực hiện để chạy dựa trên loại đối số duy nhất. Đó là nơi mà thuật ngữ một công văn xuất phát.dispatch algorithm determines which implementation to run based on the type of a single argument. That’s where the term single dispatch comes from.

Bắt đầu với Python 3.8, bạn có thể sử dụng trình trang trí

objs = [MyClass() for i in range(10)]
for obj in objs:
    other_object.add(obj)

objs[0].do_sth()
53 hoặc
class MyClass:
   def __init__(self, name):
       self.name = name
       self.checkme = 'awesome {}'.format(self.name)
...

instanceNames = ['red', 'green', 'blue']

# Here you use the dictionary
holder = {name: MyClass(name=name) for name in instanceNames}
1 để biến hàm hoặc phương thức, tương ứng, thành một hàm chung đơn. PEP 443 giải thích rằng bạn có thể tìm thấy các nhà trang trí này trong mô -đun
objs = [MyClass() for i in range(10)]
for obj in objs:
    other_object.add(obj)

objs[0].do_sth()
55.

Trong một chức năng thông thường, Python chọn cách thực hiện để gửi theo loại đối số đầu tiên của hàm. Trong một phương thức, đối số đích là định hướng đầu tiên ngay sau

class MyClass:
   def __init__(self, name):
       self.name = name
       self.checkme = 'awesome {}'.format(self.name)
...

instanceNames = ['red', 'green', 'blue']

# Here you use the dictionary
holder = {name: MyClass(name=name) for name in instanceNames}
7.

Một ví dụ về bản demo về phương pháp đơn lẻ

Để áp dụng kỹ thuật phương pháp đơn Dispatch cho một lớp nhất định, bạn cần xác định triển khai phương thức cơ sở và trang trí nó với

class MyClass:
   def __init__(self, name):
       self.name = name
       self.checkme = 'awesome {}'.format(self.name)
...

instanceNames = ['red', 'green', 'blue']

# Here you use the dictionary
holder = {name: MyClass(name=name) for name in instanceNames}
1. Sau đó, bạn có thể viết các triển khai thay thế và trang trí chúng bằng tên của phương thức cơ sở cộng với
objs = [MyClass() for i in range(10)]
for obj in objs:
    other_object.add(obj)

objs[0].do_sth()
58.

Ở đây, một ví dụ cho thấy cú pháp cơ bản:

objs = list()
for i in range(10):
    objs.append(MyClass())
4

Trong

obj_1.do_sth()
59, trước tiên bạn xác định một phương thức cơ sở gọi là
objs = [MyClass() for i in range(10)]
for obj in objs:
    other_object.add(obj)

objs[0].do_sth()
60 và trang trí nó với
class MyClass:
   def __init__(self, name):
       self.name = name
       self.checkme = 'awesome {}'.format(self.name)
...

instanceNames = ['red', 'green', 'blue']

# Here you use the dictionary
holder = {name: MyClass(name=name) for name in instanceNames}
1. Sau đó, bạn xác định hai triển khai thay thế
objs = [MyClass() for i in range(10)]
for obj in objs:
    other_object.add(obj)

objs[0].do_sth()
60 và trang trí chúng bằng
objs = [MyClass() for i in range(10)]
for obj in objs:
    other_object.add(obj)

objs[0].do_sth()
63.

Trong ví dụ này, bạn đặt tên cho các triển khai thay thế bằng cách sử dụng một dấu gạch dưới (

objs = [MyClass() for i in range(10)]
for obj in objs:
    other_object.add(obj)

objs[0].do_sth()
64) làm tên trình giữ chỗ. Trong mã thực, bạn nên sử dụng tên mô tả, miễn là chúng khác với tên phương thức cơ sở,
objs = [MyClass() for i in range(10)]
for obj in objs:
    other_object.add(obj)

objs[0].do_sth()
60. Khi sử dụng tên mô tả, hãy xem xét thêm một dấu gạch dưới hàng đầu để đánh dấu các phương thức thay thế là không công khai và ngăn chặn các cuộc gọi trực tiếp từ người dùng cuối của bạn.non-public and prevent direct calls from your end users.

Bạn có thể sử dụng các chú thích loại để xác định loại đối số đích. Bạn cũng có thể chuyển một cách rõ ràng loại đối số mục tiêu cho trình trang trí

objs = [MyClass() for i in range(10)]
for obj in objs:
    other_object.add(obj)

objs[0].do_sth()
66. Nếu bạn cần xác định một phương thức để xử lý một số loại, thì bạn có thể xếp nhiều cuộc gọi lên
objs = [MyClass() for i in range(10)]
for obj in objs:
    other_object.add(obj)

objs[0].do_sth()
66, với loại cần thiết cho mỗi loại.

Đây là cách mà lớp học của bạn hoạt động:

>>>

objs = list()
for i in range(10):
    objs.append(MyClass())
5

Trình xây dựng

objs = [MyClass() for i in range(10)]
for obj in objs:
    other_object.add(obj)

objs[0].do_sth()
49 trả về một đối tượng đường dẫn mới đại diện cho thư mục nhà của người dùng. Trình xây dựng thay thế này có thể hữu ích khi bạn xử lý các tệp cấu hình trong các ứng dụng và dự án Python của bạn.

Cuối cùng,

objs = [MyClass() for i in range(10)]
for obj in objs:
    other_object.add(obj)

objs[0].do_sth()
46 cũng cung cấp một hàm tạo gọi là
objs = [MyClass() for i in range(10)]
for obj in objs:
    other_object.add(obj)

objs[0].do_sth()
51. Phương pháp này tạo ra một đối tượng đường dẫn từ thư mục làm việc hiện tại của bạn. Hãy tiếp tục và thử nó!

Cung cấp nhiều hàm tạo với class MyClass: def __init__(self, name): self.name = name self.checkme = 'awesome {}'.format(self.name) ... instanceNames = ['red', 'green', 'blue'] # Here you use the dictionary holder = {name: MyClass(name=name) for name in instanceNames} 1

Kỹ thuật cuối cùng mà bạn sẽ học được được gọi là các hàm chung đơn. Với kỹ thuật này, bạn có thể thêm nhiều hàm tạo vào các lớp của mình và chạy chúng một cách chọn lọc, theo loại đối số đầu tiên của họ.

Chức năng chung chung đơn bao gồm nhiều chức năng thực hiện cùng một hoạt động cho các loại dữ liệu khác nhau. Thuật toán công văn cơ bản xác định việc thực hiện để chạy dựa trên loại đối số duy nhất. Đó là nơi mà thuật ngữ một công văn xuất phát.

objs = list()
for i in range(10):
    objs.append(MyClass())
6

Bắt đầu với Python 3.8, bạn có thể sử dụng trình trang trí

objs = [MyClass() for i in range(10)]
for obj in objs:
    other_object.add(obj)

objs[0].do_sth()
53 hoặc
class MyClass:
   def __init__(self, name):
       self.name = name
       self.checkme = 'awesome {}'.format(self.name)
...

instanceNames = ['red', 'green', 'blue']

# Here you use the dictionary
holder = {name: MyClass(name=name) for name in instanceNames}
1 để biến hàm hoặc phương thức, tương ứng, thành một hàm chung đơn. PEP 443 giải thích rằng bạn có thể tìm thấy các nhà trang trí này trong mô -đun
objs = [MyClass() for i in range(10)]
for obj in objs:
    other_object.add(obj)

objs[0].do_sth()
55.

  • Trong một chức năng thông thường, Python chọn cách thực hiện để gửi theo loại đối số đầu tiên của hàm. Trong một phương thức, đối số đích là định hướng đầu tiên ngay sau

    class MyClass:
       def __init__(self, name):
           self.name = name
           self.checkme = 'awesome {}'.format(self.name)
    ...
    
    instanceNames = ['red', 'green', 'blue']
    
    # Here you use the dictionary
    holder = {name: MyClass(name=name) for name in instanceNames}
    
    7. imports
    obj_1.do_sth()
    
    32 from
    objs = [MyClass() for i in range(10)]
    for obj in objs:
        other_object.add(obj)
    
    objs[0].do_sth()
    
    77 so that you can later convert any input date to a
    obj_1.do_sth()
    
    32 object.

  • Dòng 4 nhập

    class MyClass:
       def __init__(self, name):
           self.name = name
           self.checkme = 'awesome {}'.format(self.name)
    ...
    
    instanceNames = ['red', 'green', 'blue']
    
    # Here you use the dictionary
    holder = {name: MyClass(name=name) for name in instanceNames}
    
    1 để xác định phương thức quá tải. imports
    class MyClass:
       def __init__(self, name):
           self.name = name
           self.checkme = 'awesome {}'.format(self.name)
    ...
    
    instanceNames = ['red', 'green', 'blue']
    
    # Here you use the dictionary
    holder = {name: MyClass(name=name) for name in instanceNames}
    
    1 to define the overloaded method.

  • Dòng 6 định nghĩa

    objs = [MyClass() for i in range(10)]
    for obj in objs:
        other_object.add(obj)
    
    objs[0].do_sth()
    
    80 là một lớp Python thông thường. defines
    objs = [MyClass() for i in range(10)]
    for obj in objs:
        other_object.add(obj)
    
    objs[0].do_sth()
    
    80 as a regular Python class.

  • Các dòng 7 đến 9 Xác định trình khởi tạo lớp là phương thức chung đơn lẻ bằng cách sử dụng

    class MyClass:
       def __init__(self, name):
           self.name = name
           self.checkme = 'awesome {}'.format(self.name)
    ...
    
    instanceNames = ['red', 'green', 'blue']
    
    # Here you use the dictionary
    holder = {name: MyClass(name=name) for name in instanceNames}
    
    1. Đây là phương pháp triển khai cơ sở và nó tăng
    objs = [MyClass() for i in range(10)]
    for obj in objs:
        other_object.add(obj)
    
    objs[0].do_sth()
    
    82 cho các định dạng ngày không được hỗ trợ.
    define the class initializer as a single-dispatch generic method using
    class MyClass:
       def __init__(self, name):
           self.name = name
           self.checkme = 'awesome {}'.format(self.name)
    ...
    
    instanceNames = ['red', 'green', 'blue']
    
    # Here you use the dictionary
    holder = {name: MyClass(name=name) for name in instanceNames}
    
    1. This is the method’s base implementation, and it raises a
    objs = [MyClass() for i in range(10)]
    for obj in objs:
        other_object.add(obj)
    
    objs[0].do_sth()
    
    82 for unsupported date formats.

  • Các dòng 11 đến 13 Đăng ký triển khai

    class MyClass:
       def __init__(self, name):
           self.name = name
           self.checkme = 'awesome {}'.format(self.name)
    ...
    
    instanceNames = ['red', 'green', 'blue']
    
    # Here you use the dictionary
    holder = {name: MyClass(name=name) for name in instanceNames}
    
    4 xử lý trực tiếp các đối tượng
    obj_1.do_sth()
    
    32.
    register an implementation of
    class MyClass:
       def __init__(self, name):
           self.name = name
           self.checkme = 'awesome {}'.format(self.name)
    ...
    
    instanceNames = ['red', 'green', 'blue']
    
    # Here you use the dictionary
    holder = {name: MyClass(name=name) for name in instanceNames}
    
    4 that processes
    obj_1.do_sth()
    
    32 objects directly.

  • Các dòng 15 đến 17 Xác định việc thực hiện

    class MyClass:
       def __init__(self, name):
           self.name = name
           self.checkme = 'awesome {}'.format(self.name)
    ...
    
    instanceNames = ['red', 'green', 'blue']
    
    # Here you use the dictionary
    holder = {name: MyClass(name=name) for name in instanceNames}
    
    4 mà các ngày xử lý các ngày đến như các chuỗi có định dạng ISO. define the implementation of
    class MyClass:
       def __init__(self, name):
           self.name = name
           self.checkme = 'awesome {}'.format(self.name)
    ...
    
    instanceNames = ['red', 'green', 'blue']
    
    # Here you use the dictionary
    holder = {name: MyClass(name=name) for name in instanceNames}
    
    4 that processes dates that come as strings with an ISO format.

  • Các dòng 19 đến 22 Đăng ký một triển khai xử lý ngày diễn ra theo thời gian Unix tính bằng giây kể từ thời đại. Lần này, bạn đăng ký hai trường hợp của phương thức quá tải bằng cách xếp loại trang trí

    objs = [MyClass() for i in range(10)]
    for obj in objs:
        other_object.add(obj)
    
    objs[0].do_sth()
    
    58 với các loại
    objs = [MyClass() for i in range(10)]
    for obj in objs:
        other_object.add(obj)
    
    objs[0].do_sth()
    
    69 và
    objs = [MyClass() for i in range(10)]
    for obj in objs:
        other_object.add(obj)
    
    objs[0].do_sth()
    
    88.
    register an implementation that processes dates that come as Unix time in seconds since the epoch. This time, you register two instances of the overloaded method by stacking the
    objs = [MyClass() for i in range(10)]
    for obj in objs:
        other_object.add(obj)
    
    objs[0].do_sth()
    
    58 decorator with the
    objs = [MyClass() for i in range(10)]
    for obj in objs:
        other_object.add(obj)
    
    objs[0].do_sth()
    
    69 and
    objs = [MyClass() for i in range(10)]
    for obj in objs:
        other_object.add(obj)
    
    objs[0].do_sth()
    
    88 types.

  • Các dòng 24 đến 25 cung cấp một phương pháp thường xuyên để tính toán tuổi của một người nhất định. Lưu ý rằng việc thực hiện

    objs = [MyClass() for i in range(10)]
    for obj in objs:
        other_object.add(obj)
    
    objs[0].do_sth()
    
    89 là hoàn toàn chính xác vì nó không xem xét tháng và ngày trong năm khi tính độ tuổi. Phương pháp
    objs = [MyClass() for i in range(10)]
    for obj in objs:
        other_object.add(obj)
    
    objs[0].do_sth()
    
    89 chỉ là một tính năng thưởng để làm phong phú ví dụ.
    provide a regular method to compute the age of a given person. Note that the implementation of
    objs = [MyClass() for i in range(10)]
    for obj in objs:
        other_object.add(obj)
    
    objs[0].do_sth()
    
    89 isn’t totally accurate because it doesn’t consider the month and day of the year when calculating the age. The
    objs = [MyClass() for i in range(10)]
    for obj in objs:
        other_object.add(obj)
    
    objs[0].do_sth()
    
    89 method is just a bonus feature to enrich the example.

Bây giờ bạn có thể sử dụng thành phần trong lớp

class MyClass:
   def __init__(self, name):
       self.name = name
       self.checkme = 'awesome {}'.format(self.name)
...

instanceNames = ['red', 'green', 'blue']

# Here you use the dictionary
holder = {name: MyClass(name=name) for name in instanceNames}
5 của mình để tận dụng lớp
objs = [MyClass() for i in range(10)]
for obj in objs:
    other_object.add(obj)

objs[0].do_sth()
80 mới. Đi trước và cập nhật
class MyClass:
   def __init__(self, name):
       self.name = name
       self.checkme = 'awesome {}'.format(self.name)
...

instanceNames = ['red', 'green', 'blue']

# Here you use the dictionary
holder = {name: MyClass(name=name) for name in instanceNames}
5 với mã sau:

objs = list()
for i in range(10):
    objs.append(MyClass())
7

Trong bản cập nhật này,

class MyClass:
   def __init__(self, name):
       self.name = name
       self.checkme = 'awesome {}'.format(self.name)
...

instanceNames = ['red', 'green', 'blue']

# Here you use the dictionary
holder = {name: MyClass(name=name) for name in instanceNames}
5 có một thuộc tính không công khai mới có tên là
objs = [MyClass() for i in range(10)]
for obj in objs:
    other_object.add(obj)

objs[0].do_sth()
95, đây là một ví dụ là
objs = [MyClass() for i in range(10)]
for obj in objs:
    other_object.add(obj)

objs[0].do_sth()
80. Trường hợp này được khởi tạo với đối số đầu vào
obj_1.do_sth()
39. Bộ khởi tạo quá tải của
objs = [MyClass() for i in range(10)]
for obj in objs:
    other_object.add(obj)

objs[0].do_sth()
80 sẽ khởi tạo
objs = [MyClass() for i in range(10)]
for obj in objs:
    other_object.add(obj)

objs[0].do_sth()
95 theo ngày sinh của người dùng.

Sau đó, bạn xác định

objs = [MyClass() for i in range(10)]
for obj in objs:
    other_object.add(obj)

objs[0].do_sth()
89 là một thuộc tính để cung cấp một thuộc tính được tính toán trả về độ tuổi gần đúng của người. Việc bổ sung cuối cùng cho
class MyClass:
   def __init__(self, name):
       self.name = name
       self.checkme = 'awesome {}'.format(self.name)
...

instanceNames = ['red', 'green', 'blue']

# Here you use the dictionary
holder = {name: MyClass(name=name) for name in instanceNames}
5 là thuộc tính
objs = list()
for i in range(10):
    objs.append(MyClass())
02, trả lại ngày sinh của người đó dưới dạng đối tượng
obj_1.do_sth()
32.

Để thử các lớp

class MyClass:
   def __init__(self, name):
       self.name = name
       self.checkme = 'awesome {}'.format(self.name)
...

instanceNames = ['red', 'green', 'blue']

# Here you use the dictionary
holder = {name: MyClass(name=name) for name in instanceNames}
5 và
objs = [MyClass() for i in range(10)]
for obj in objs:
    other_object.add(obj)

objs[0].do_sth()
80 của bạn, hãy mở một phiên tương tác và chạy mã sau:

>>>

objs = list()
for i in range(10):
    objs.append(MyClass())
8

Bạn có thể khởi tạo

class MyClass:
   def __init__(self, name):
       self.name = name
       self.checkme = 'awesome {}'.format(self.name)
...

instanceNames = ['red', 'green', 'blue']

# Here you use the dictionary
holder = {name: MyClass(name=name) for name in instanceNames}
5 bằng các định dạng ngày khác nhau. Thể hiện nội bộ của
objs = list()
for i in range(10):
    objs.append(MyClass())
07 tự động chuyển đổi ngày đầu vào thành một đối tượng ngày. Nếu bạn khởi tạo
class MyClass:
   def __init__(self, name):
       self.name = name
       self.checkme = 'awesome {}'.format(self.name)
...

instanceNames = ['red', 'green', 'blue']

# Here you use the dictionary
holder = {name: MyClass(name=name) for name in instanceNames}
5 với định dạng ngày không được hỗ trợ, chẳng hạn như từ điển, thì bạn sẽ nhận được
objs = [MyClass() for i in range(10)]
for obj in objs:
    other_object.add(obj)

objs[0].do_sth()
82.

Lưu ý rằng

objs = list()
for i in range(10):
    objs.append(MyClass())
10 chăm sóc xử lý ngày sinh đầu vào cho bạn. Không cần phải sử dụng các hàm tạo thay thế rõ ràng để xử lý các loại đầu vào khác nhau. Bạn chỉ có thể khởi tạo lớp bằng hàm tạo tiêu chuẩn.

Hạn chế chính của kỹ thuật phương pháp đơn lẻ là nó dựa vào một đối số duy nhất, đối số đầu tiên sau

class MyClass:
   def __init__(self, name):
       self.name = name
       self.checkme = 'awesome {}'.format(self.name)
...

instanceNames = ['red', 'green', 'blue']

# Here you use the dictionary
holder = {name: MyClass(name=name) for name in instanceNames}
7. Nếu bạn cần sử dụng nhiều đối số để gửi các triển khai phù hợp, thì hãy kiểm tra một số thư viện của bên thứ ba hiện có, chẳng hạn như MultipleSpatch và Multimethod.

Sự kết luận

Viết các lớp Python với nhiều hàm tạo có thể làm cho mã của bạn linh hoạt và linh hoạt hơn, bao gồm một loạt các trường hợp sử dụng. Nhiều hàm tạo là một tính năng mạnh mẽ cho phép bạn xây dựng các phiên bản của lớp cơ bản bằng cách sử dụng các đối số của các loại khác nhau, một số lượng đối số khác nhau hoặc cả hai, tùy thuộc vào nhu cầu của bạn.multiple constructors can make your code more versatile and flexible, covering a wide range of use cases. Multiple constructors are a powerful feature that allows you to build instances of the underlying class using arguments of different types, a different number of arguments, or both, depending on your needs.

Trong hướng dẫn này, bạn đã học được cách:

  • Mô phỏng nhiều hàm tạo bằng cách sử dụng các đối số tùy chọn và kiểm tra loạioptional arguments and type checking
  • Viết nhiều hàm tạo bằng cách sử dụng trình trang trí
    class MyClass:
       def __init__(self, name):
           self.name = name
           self.checkme = 'awesome {}'.format(self.name)
    ...
    
    instanceNames = ['red', 'green', 'blue']
    
    # Here you use the dictionary
    holder = {name: MyClass(name=name) for name in instanceNames}
    
    0 tích hợp
    class MyClass:
       def __init__(self, name):
           self.name = name
           self.checkme = 'awesome {}'.format(self.name)
    ...
    
    instanceNames = ['red', 'green', 'blue']
    
    # Here you use the dictionary
    holder = {name: MyClass(name=name) for name in instanceNames}
    
    0
    decorator
  • Quá tải các hàm tạo lớp của bạn bằng cách sử dụng trình trang trí
    class MyClass:
       def __init__(self, name):
           self.name = name
           self.checkme = 'awesome {}'.format(self.name)
    ...
    
    instanceNames = ['red', 'green', 'blue']
    
    # Here you use the dictionary
    holder = {name: MyClass(name=name) for name in instanceNames}
    
    1
    class MyClass:
       def __init__(self, name):
           self.name = name
           self.checkme = 'awesome {}'.format(self.name)
    ...
    
    instanceNames = ['red', 'green', 'blue']
    
    # Here you use the dictionary
    holder = {name: MyClass(name=name) for name in instanceNames}
    
    1
    decorator

Bạn cũng đã học được cách Python xây dựng các trường hợp của một lớp nhất định và cách một số lớp thư viện tiêu chuẩn cung cấp nhiều hàm tạo.constructs instances of a given class and how some standard-library classes provide multiple constructors.

Với kiến ​​thức này, bây giờ bạn có thể thêm gia vị cho các lớp học của mình với nhiều nhà xây dựng, trang bị cho họ một số cách để giải quyết quá trình khởi tạo trong Python.

Chúng ta có thể tạo nhiều đối tượng cho lớp đơn trong Python không?

Một định nghĩa lớp duy nhất có thể được sử dụng để tạo nhiều đối tượng.Như đã đề cập trước đây, các đối tượng là độc lập.

Bạn có thể tạo nhiều đối tượng một lớp không?

Một chương trình có thể tạo ra nhiều đối tượng của cùng một lớp.Các đối tượng còn được gọi là các thể hiện và chúng có thể được lưu trữ trong một biến được đặt tên hoặc trong một mảng hoặc bộ sưu tập.Mã máy khách là mã sử dụng các biến này để gọi các phương thức và truy cập các thuộc tính công khai của đối tượng.. Objects are also called instances, and they can be stored in either a named variable or in an array or collection. Client code is the code that uses these variables to call the methods and access the public properties of the object.