Trăn điều hành mũ

Có một số lượng lớn các phép toán set, bao gồm hợp [|], giao [&], hiệu [-], hiệu đối xứng [^]. Đây là những hoạt động bất thường, vì vậy chúng tôi sẽ xem xét chúng một cách chi tiết. Ngoài ký hiệu toán tử này, còn có các hàm phương thức làm những việc tương tự. Chúng ta sẽ xem xét các phiên bản hàm phương thức bên dưới

Chúng tôi sẽ sử dụng hai set sau đây để hiển thị các toán tử này

>>> 
fib=set[ [1,1,2,3,5,8,13] ]

>>> 
prime=set[ [2,3,5,7,11,13] ]

Liên hiệp,

Kết quả set có các phần tử là duy nhất cho mỗi set. Một phần tử sẽ có trong kết quả set nếu nó nằm ở bên trái set và không ở bên phải set hoặc nó nằm ở bên phải set và không ở bên trái set. chà

Nó dường như dựa trên 8, vì vậy tôi đoán một số loại hoạt động byte?

Giải pháp tốt nhất

Đó là XOR bitwise [OR độc quyền]

Kết quả là true nếu một [và chỉ một] toán hạng [được đánh giá là] true

Để lam sang tỏ

>>> 0^0
0
>>> 1^1
0
>>> 1^0
1
>>> 0^1
1

Để giải thích một trong những ví dụ của riêng bạn

>>> 8^3
11

Nghĩ về nó theo cách này

1000  # 8 [binary]
0011  # 3 [binary]
----  # APPLY XOR ['vertically']
1011  # result = 11 [binary]

Giải pháp liên quan

Python – Siêu dữ liệu trong Python là gì

Các lớp như các đối tượng

Trước khi hiểu về siêu dữ liệu, bạn cần nắm vững các lớp trong Python. Và Python có một ý tưởng rất đặc biệt về lớp là gì, mượn từ ngôn ngữ Smalltalk

Trong hầu hết các ngôn ngữ, các lớp chỉ là những đoạn mã mô tả cách tạo ra một đối tượng. Điều đó cũng đúng trong Python

>>> class ObjectCreator[object]:
..       pass
...

>>> my_object = ObjectCreator[]
>>> print[my_object]

Nhưng các lớp còn nhiều hơn thế trong Python. Lớp cũng là đối tượng

Vâng, đồ vật

Ngay khi bạn sử dụng từ khóa

>>> class ObjectCreator[object]:
..       pass
...

>>> my_object = ObjectCreator[]
>>> print[my_object]

7, Python sẽ thực thi nó và tạo một đối tượng. Hướng dẫn

>>> class ObjectCreator[object]:
..       pass
...

tạo trong bộ nhớ một đối tượng có tên

>>> class ObjectCreator[object]:
..       pass
...

>>> my_object = ObjectCreator[]
>>> print[my_object]

8

Bản thân đối tượng này [lớp] có khả năng tạo đối tượng [các thể hiện] và đây là lý do tại sao nó là một lớp

Tuy nhiên, nó vẫn là một đối tượng, và do đó

  • bạn có thể gán nó cho một biến
  • bạn có thể sao chép nó
  • bạn có thể thêm các thuộc tính cho nó
  • bạn có thể chuyển nó dưới dạng tham số chức năng

e. g

>>> print[ObjectCreator] # you can print a class because it's an object

>>> def echo[o]:
..       print[o]
...
>>> echo[ObjectCreator] # you can pass a class as a parameter

>>> print[hasattr[ObjectCreator, 'new_attribute']]
False
>>> ObjectCreator.new_attribute = 'foo' # you can add attributes to a class
>>> print[hasattr[ObjectCreator, 'new_attribute']]
True
>>> print[ObjectCreator.new_attribute]
foo
>>> ObjectCreatorMirror = ObjectCreator # you can assign a class to a variable
>>> print[ObjectCreatorMirror.new_attribute]
foo
>>> print[ObjectCreatorMirror[]]

Tạo các lớp linh hoạt

Vì các lớp là các đối tượng, bạn có thể tạo chúng một cách nhanh chóng, giống như bất kỳ đối tượng nào

Đầu tiên, bạn có thể tạo một lớp trong một hàm bằng cách sử dụng

>>> class ObjectCreator[object]:
..       pass
...

>>> my_object = ObjectCreator[]
>>> print[my_object]

7

>>> def choose_class[name]:
..     if name == 'foo':
..         class Foo[object]:
..             pass
..         return Foo # return the class, not an instance
..     else:
..         class Bar[object]:
..             pass
..         return Bar
...
>>> MyClass = choose_class['foo']
>>> print[MyClass] # the function returns a class, not an instance

>>> print[MyClass[]] # you can create an object from this class

Nhưng nó không năng động lắm, vì bạn vẫn phải tự viết cả lớp

Vì các lớp là các đối tượng, chúng phải được tạo bởi một cái gì đó

Khi bạn sử dụng từ khóa

>>> class ObjectCreator[object]:
..       pass
...

>>> my_object = ObjectCreator[]
>>> print[my_object]

7, Python sẽ tự động tạo đối tượng này. Nhưng cũng giống như hầu hết mọi thứ trong Python, nó cung cấp cho bạn một cách để thực hiện thủ công

Ghi chức năng

>>> class ObjectCreator[object]:
..       pass
...
1?

>>> print[type[1]]

>>> print[type["1"]]

>>> print[type[ObjectCreator]]

>>> print[type[ObjectCreator[]]]

Chà, có một khả năng hoàn toàn khác, nó cũng có thể tạo các lớp một cách nhanh chóng.

>>> class ObjectCreator[object]:
..       pass
...
1 có thể lấy mô tả của một lớp làm tham số và trả về một lớp

[Tôi biết, thật ngớ ngẩn khi cùng một chức năng có thể có hai cách sử dụng hoàn toàn khác nhau tùy theo các tham số bạn truyền cho nó. Đó là sự cố do khả năng tương thích ngược trong Python]

>>> class ObjectCreator[object]:
..       pass
...
1 hoạt động theo cách này

type[name, bases, attrs]

Ở đâu

  • >>> class ObjectCreator[object]:
    ..       pass
    ...
    
    5. tên của lớp
  • >>> class ObjectCreator[object]:
    ..       pass
    ...
    
    6. bộ của lớp cha [để kế thừa, có thể để trống]
  • >>> class ObjectCreator[object]:
    ..       pass
    ...
    
    7. từ điển chứa tên và giá trị thuộc tính

e. g

>>> 0^0
0
>>> 1^1
0
>>> 1^0
1
>>> 0^1
1
0

có thể được tạo thủ công theo cách này

>>> 0^0
0
>>> 1^1
0
>>> 1^0
1
>>> 0^1
1
1

Bạn sẽ nhận thấy rằng chúng tôi sử dụng

>>> class ObjectCreator[object]:
..       pass
...
8 làm tên của lớp và làm biến để giữ tham chiếu lớp. Chúng có thể khác nhau, nhưng không có lý do gì để phức tạp hóa mọi thứ

>>> class ObjectCreator[object]:
..       pass
...
1 chấp nhận một từ điển để định nghĩa các thuộc tính của lớp. Vì thế

>>> 0^0
0
>>> 1^1
0
>>> 1^0
1
>>> 0^1
1
2

Có thể được dịch sang

>>> 0^0
0
>>> 1^1
0
>>> 1^0
1
>>> 0^1
1
3

Và được sử dụng như một lớp bình thường

>>> 0^0
0
>>> 1^1
0
>>> 1^0
1
>>> 0^1
1
4

Và tất nhiên, bạn có thể kế thừa từ nó, vì vậy

>>> 0^0
0
>>> 1^1
0
>>> 1^0
1
>>> 0^1
1
5

sẽ là

>>> 0^0
0
>>> 1^1
0
>>> 1^0
1
>>> 0^1
1
6

Cuối cùng, bạn sẽ muốn thêm các phương thức vào lớp của mình. Chỉ cần xác định một hàm có chữ ký phù hợp và gán nó làm thuộc tính

>>> 0^0
0
>>> 1^1
0
>>> 1^0
1
>>> 0^1
1
7

Và bạn có thể thêm nhiều phương thức hơn nữa sau khi bạn tự động tạo lớp, giống như thêm các phương thức vào một đối tượng lớp được tạo thông thường

>>> 0^0
0
>>> 1^1
0
>>> 1^0
1
>>> 0^1
1
8

Bạn thấy chúng ta đang đi đâu. trong Python, các lớp là các đối tượng và bạn có thể tạo một lớp nhanh chóng, linh hoạt

Đây là những gì Python làm khi bạn sử dụng từ khóa

>>> class ObjectCreator[object]:
..       pass
...

>>> my_object = ObjectCreator[]
>>> print[my_object]

7 và nó làm như vậy bằng cách sử dụng siêu dữ liệu

Siêu dữ liệu là gì [cuối cùng]

Siêu dữ liệu là 'công cụ' tạo ra các lớp

Bạn định nghĩa các lớp để tạo các đối tượng, phải không?

Nhưng chúng tôi đã học được rằng các lớp Python là các đối tượng

Chà, siêu dữ liệu là thứ tạo ra các đối tượng này. Chúng là các lớp của các lớp, bạn có thể hình dung chúng theo cách này

>>> 0^0
0
>>> 1^1
0
>>> 1^0
1
>>> 0^1
1
9

Bạn đã thấy rằng

>>> class ObjectCreator[object]:
..       pass
...
1 cho phép bạn làm điều gì đó như thế này

>>> 8^3
11
0

Đó là bởi vì chức năng

>>> class ObjectCreator[object]:
..       pass
...
1 trên thực tế là một siêu dữ liệu.
>>> class ObjectCreator[object]:
..       pass
...
1 là siêu dữ liệu Python sử dụng để tạo tất cả các lớp phía sau hậu trường

Bây giờ bạn tự hỏi "tại sao nó lại được viết bằng chữ thường mà không phải là

>>> print[ObjectCreator] # you can print a class because it's an object

>>> def echo[o]:
..       print[o]
...
>>> echo[ObjectCreator] # you can pass a class as a parameter

>>> print[hasattr[ObjectCreator, 'new_attribute']]
False
>>> ObjectCreator.new_attribute = 'foo' # you can add attributes to a class
>>> print[hasattr[ObjectCreator, 'new_attribute']]
True
>>> print[ObjectCreator.new_attribute]
foo
>>> ObjectCreatorMirror = ObjectCreator # you can assign a class to a variable
>>> print[ObjectCreatorMirror.new_attribute]
foo
>>> print[ObjectCreatorMirror[]]

4?"

Chà, tôi đoán đó là vấn đề nhất quán với

>>> print[ObjectCreator] # you can print a class because it's an object

>>> def echo[o]:
..       print[o]
...
>>> echo[ObjectCreator] # you can pass a class as a parameter

>>> print[hasattr[ObjectCreator, 'new_attribute']]
False
>>> ObjectCreator.new_attribute = 'foo' # you can add attributes to a class
>>> print[hasattr[ObjectCreator, 'new_attribute']]
True
>>> print[ObjectCreator.new_attribute]
foo
>>> ObjectCreatorMirror = ObjectCreator # you can assign a class to a variable
>>> print[ObjectCreatorMirror.new_attribute]
foo
>>> print[ObjectCreatorMirror[]]

5, lớp tạo đối tượng chuỗi và
>>> print[ObjectCreator] # you can print a class because it's an object

>>> def echo[o]:
..       print[o]
...
>>> echo[ObjectCreator] # you can pass a class as a parameter

>>> print[hasattr[ObjectCreator, 'new_attribute']]
False
>>> ObjectCreator.new_attribute = 'foo' # you can add attributes to a class
>>> print[hasattr[ObjectCreator, 'new_attribute']]
True
>>> print[ObjectCreator.new_attribute]
foo
>>> ObjectCreatorMirror = ObjectCreator # you can assign a class to a variable
>>> print[ObjectCreatorMirror.new_attribute]
foo
>>> print[ObjectCreatorMirror[]]

6 lớp tạo đối tượng số nguyên.
>>> class ObjectCreator[object]:
..       pass
...
1 chỉ là lớp tạo ra các đối tượng lớp

Bạn thấy điều đó bằng cách kiểm tra thuộc tính

>>> print[ObjectCreator] # you can print a class because it's an object

>>> def echo[o]:
..       print[o]
...
>>> echo[ObjectCreator] # you can pass a class as a parameter

>>> print[hasattr[ObjectCreator, 'new_attribute']]
False
>>> ObjectCreator.new_attribute = 'foo' # you can add attributes to a class
>>> print[hasattr[ObjectCreator, 'new_attribute']]
True
>>> print[ObjectCreator.new_attribute]
foo
>>> ObjectCreatorMirror = ObjectCreator # you can assign a class to a variable
>>> print[ObjectCreatorMirror.new_attribute]
foo
>>> print[ObjectCreatorMirror[]]

8

Mọi thứ, và ý tôi là mọi thứ, là một đối tượng trong Python. Điều đó bao gồm số nguyên, chuỗi, hàm và lớp. Tất cả đều là đối tượng. Và tất cả chúng đã được tạo ra từ một lớp

>>> 8^3
11
1

Bây giờ,

>>> print[ObjectCreator] # you can print a class because it's an object

>>> def echo[o]:
..       print[o]
...
>>> echo[ObjectCreator] # you can pass a class as a parameter

>>> print[hasattr[ObjectCreator, 'new_attribute']]
False
>>> ObjectCreator.new_attribute = 'foo' # you can add attributes to a class
>>> print[hasattr[ObjectCreator, 'new_attribute']]
True
>>> print[ObjectCreator.new_attribute]
foo
>>> ObjectCreatorMirror = ObjectCreator # you can assign a class to a variable
>>> print[ObjectCreatorMirror.new_attribute]
foo
>>> print[ObjectCreatorMirror[]]

8 của bất kỳ
>>> print[ObjectCreator] # you can print a class because it's an object

>>> def echo[o]:
..       print[o]
...
>>> echo[ObjectCreator] # you can pass a class as a parameter

>>> print[hasattr[ObjectCreator, 'new_attribute']]
False
>>> ObjectCreator.new_attribute = 'foo' # you can add attributes to a class
>>> print[hasattr[ObjectCreator, 'new_attribute']]
True
>>> print[ObjectCreator.new_attribute]
foo
>>> ObjectCreatorMirror = ObjectCreator # you can assign a class to a variable
>>> print[ObjectCreatorMirror.new_attribute]
foo
>>> print[ObjectCreatorMirror[]]

8 nào?

>>> 8^3
11
2

Vì vậy, siêu dữ liệu chỉ là thứ tạo ra các đối tượng lớp

Bạn có thể gọi nó là 'nhà máy đẳng cấp' nếu muốn

>>> class ObjectCreator[object]:
..       pass
...
1 là siêu dữ liệu tích hợp sẵn mà Python sử dụng, nhưng tất nhiên, bạn có thể tạo siêu dữ liệu của riêng mình

thuộc tính

Trong Python 2, bạn có thể thêm thuộc tính

>>> def choose_class[name]:
..     if name == 'foo':
..         class Foo[object]:
..             pass
..         return Foo # return the class, not an instance
..     else:
..         class Bar[object]:
..             pass
..         return Bar
...
>>> MyClass = choose_class['foo']
>>> print[MyClass] # the function returns a class, not an instance

>>> print[MyClass[]] # you can create an object from this class

2 khi viết một lớp [xem phần tiếp theo để biết cú pháp Python 3]

>>> 8^3
11
3

Nếu bạn làm như vậy, Python sẽ sử dụng siêu dữ liệu để tạo lớp

>>> def choose_class[name]:
..     if name == 'foo':
..         class Foo[object]:
..             pass
..         return Foo # return the class, not an instance
..     else:
..         class Bar[object]:
..             pass
..         return Bar
...
>>> MyClass = choose_class['foo']
>>> print[MyClass] # the function returns a class, not an instance

>>> print[MyClass[]] # you can create an object from this class

4

Cẩn thận, nó khó

Bạn viết

>>> def choose_class[name]:
..     if name == 'foo':
..         class Foo[object]:
..             pass
..         return Foo # return the class, not an instance
..     else:
..         class Bar[object]:
..             pass
..         return Bar
...
>>> MyClass = choose_class['foo']
>>> print[MyClass] # the function returns a class, not an instance

>>> print[MyClass[]] # you can create an object from this class

5 trước, nhưng đối tượng lớp
>>> def choose_class[name]:
..     if name == 'foo':
..         class Foo[object]:
..             pass
..         return Foo # return the class, not an instance
..     else:
..         class Bar[object]:
..             pass
..         return Bar
...
>>> MyClass = choose_class['foo']
>>> print[MyClass] # the function returns a class, not an instance

>>> print[MyClass[]] # you can create an object from this class

4 chưa được tạo trong bộ nhớ

Python sẽ tìm kiếm

>>> def choose_class[name]:
..     if name == 'foo':
..         class Foo[object]:
..             pass
..         return Foo # return the class, not an instance
..     else:
..         class Bar[object]:
..             pass
..         return Bar
...
>>> MyClass = choose_class['foo']
>>> print[MyClass] # the function returns a class, not an instance

>>> print[MyClass[]] # you can create an object from this class

2 trong định nghĩa lớp. Nếu nó tìm thấy nó, nó sẽ sử dụng nó để tạo lớp đối tượng
>>> def choose_class[name]:
..     if name == 'foo':
..         class Foo[object]:
..             pass
..         return Foo # return the class, not an instance
..     else:
..         class Bar[object]:
..             pass
..         return Bar
...
>>> MyClass = choose_class['foo']
>>> print[MyClass] # the function returns a class, not an instance

>>> print[MyClass[]] # you can create an object from this class

4. Nếu không, nó sẽ sử dụng
>>> class ObjectCreator[object]:
..       pass
...
1 để tạo lớp

Đọc cái đó mấy lần

khi bạn làm

>>> 8^3
11
4

Python làm như sau

Có thuộc tính

>>> def choose_class[name]:
..     if name == 'foo':
..         class Foo[object]:
..             pass
..         return Foo # return the class, not an instance
..     else:
..         class Bar[object]:
..             pass
..         return Bar
...
>>> MyClass = choose_class['foo']
>>> print[MyClass] # the function returns a class, not an instance

>>> print[MyClass[]] # you can create an object from this class

2 trong
>>> def choose_class[name]:
..     if name == 'foo':
..         class Foo[object]:
..             pass
..         return Foo # return the class, not an instance
..     else:
..         class Bar[object]:
..             pass
..         return Bar
...
>>> MyClass = choose_class['foo']
>>> print[MyClass] # the function returns a class, not an instance

>>> print[MyClass[]] # you can create an object from this class

4 không?

Nếu có, hãy tạo trong bộ nhớ một đối tượng lớp [tôi đã nói là một đối tượng lớp, hãy ở lại với tôi ở đây], với tên

>>> def choose_class[name]:
..     if name == 'foo':
..         class Foo[object]:
..             pass
..         return Foo # return the class, not an instance
..     else:
..         class Bar[object]:
..             pass
..         return Bar
...
>>> MyClass = choose_class['foo']
>>> print[MyClass] # the function returns a class, not an instance

>>> print[MyClass[]] # you can create an object from this class

4 bằng cách sử dụng những gì có trong
>>> def choose_class[name]:
..     if name == 'foo':
..         class Foo[object]:
..             pass
..         return Foo # return the class, not an instance
..     else:
..         class Bar[object]:
..             pass
..         return Bar
...
>>> MyClass = choose_class['foo']
>>> print[MyClass] # the function returns a class, not an instance

>>> print[MyClass[]] # you can create an object from this class

2

Nếu Python không thể tìm thấy

>>> def choose_class[name]:
..     if name == 'foo':
..         class Foo[object]:
..             pass
..         return Foo # return the class, not an instance
..     else:
..         class Bar[object]:
..             pass
..         return Bar
...
>>> MyClass = choose_class['foo']
>>> print[MyClass] # the function returns a class, not an instance

>>> print[MyClass[]] # you can create an object from this class

2, nó sẽ tìm kiếm một
>>> def choose_class[name]:
..     if name == 'foo':
..         class Foo[object]:
..             pass
..         return Foo # return the class, not an instance
..     else:
..         class Bar[object]:
..             pass
..         return Bar
...
>>> MyClass = choose_class['foo']
>>> print[MyClass] # the function returns a class, not an instance

>>> print[MyClass[]] # you can create an object from this class

2 ở cấp độ MODULE và cố gắng làm điều tương tự [nhưng chỉ đối với các lớp không kế thừa bất cứ thứ gì, về cơ bản là các lớp kiểu cũ]

Sau đó, nếu nó không thể tìm thấy bất kỳ

>>> def choose_class[name]:
..     if name == 'foo':
..         class Foo[object]:
..             pass
..         return Foo # return the class, not an instance
..     else:
..         class Bar[object]:
..             pass
..         return Bar
...
>>> MyClass = choose_class['foo']
>>> print[MyClass] # the function returns a class, not an instance

>>> print[MyClass[]] # you can create an object from this class

2 nào, thì nó sẽ sử dụng siêu dữ liệu riêng của
>>> print[type[1]]

>>> print[type["1"]]

>>> print[type[ObjectCreator]]

>>> print[type[ObjectCreator[]]]

7 [cha đầu tiên] [có thể là mặc định của
>>> class ObjectCreator[object]:
..       pass
...
1] để tạo đối tượng lớp

Hãy cẩn thận ở đây rằng thuộc tính

>>> def choose_class[name]:
..     if name == 'foo':
..         class Foo[object]:
..             pass
..         return Foo # return the class, not an instance
..     else:
..         class Bar[object]:
..             pass
..         return Bar
...
>>> MyClass = choose_class['foo']
>>> print[MyClass] # the function returns a class, not an instance

>>> print[MyClass[]] # you can create an object from this class

2 sẽ không được kế thừa, siêu dữ liệu của cha mẹ [
type[name, bases, attrs]
0] sẽ là. Nếu
>>> print[type[1]]

>>> print[type["1"]]

>>> print[type[ObjectCreator]]

>>> print[type[ObjectCreator[]]]

7 đã sử dụng thuộc tính
>>> def choose_class[name]:
..     if name == 'foo':
..         class Foo[object]:
..             pass
..         return Foo # return the class, not an instance
..     else:
..         class Bar[object]:
..             pass
..         return Bar
...
>>> MyClass = choose_class['foo']
>>> print[MyClass] # the function returns a class, not an instance

>>> print[MyClass[]] # you can create an object from this class

2 đã tạo ra
>>> print[type[1]]

>>> print[type["1"]]

>>> print[type[ObjectCreator]]

>>> print[type[ObjectCreator[]]]

7 với
type[name, bases, attrs]
4 [chứ không phải
type[name, bases, attrs]
5], thì các lớp con sẽ không kế thừa hành vi đó

Bây giờ câu hỏi lớn là, bạn có thể đặt gì vào

>>> def choose_class[name]:
..     if name == 'foo':
..         class Foo[object]:
..             pass
..         return Foo # return the class, not an instance
..     else:
..         class Bar[object]:
..             pass
..         return Bar
...
>>> MyClass = choose_class['foo']
>>> print[MyClass] # the function returns a class, not an instance

>>> print[MyClass[]] # you can create an object from this class

2?

Câu trả lời là một cái gì đó có thể tạo ra một lớp học

Và những gì có thể tạo ra một lớp học?

Siêu dữ liệu trong Python 3

Cú pháp đặt siêu dữ liệu đã được thay đổi trong Python 3

>>> 8^3
11
5

i. e. thuộc tính

>>> def choose_class[name]:
..     if name == 'foo':
..         class Foo[object]:
..             pass
..         return Foo # return the class, not an instance
..     else:
..         class Bar[object]:
..             pass
..         return Bar
...
>>> MyClass = choose_class['foo']
>>> print[MyClass] # the function returns a class, not an instance

>>> print[MyClass[]] # you can create an object from this class

2 không còn được sử dụng, thay vào đó là đối số từ khóa trong danh sách các lớp cơ sở

Tuy nhiên, hành vi của siêu dữ liệu hầu như không thay đổi

Một điều được thêm vào siêu dữ liệu trong Python 3 là bạn cũng có thể chuyển các thuộc tính dưới dạng đối số từ khóa vào siêu dữ liệu, như vậy

>>> 8^3
11
6

Đọc phần bên dưới để biết cách Python xử lý việc này

Siêu dữ liệu tùy chỉnh

Mục đích chính của siêu dữ liệu là tự động thay đổi lớp khi nó được tạo

Bạn thường làm điều này cho các API, nơi bạn muốn tạo các lớp phù hợp với ngữ cảnh hiện tại

Hãy tưởng tượng một ví dụ ngớ ngẩn, nơi bạn quyết định rằng tất cả các lớp trong mô-đun của bạn phải có các thuộc tính được viết hoa. Có một số cách để thực hiện việc này, nhưng một cách là đặt

>>> def choose_class[name]:
..     if name == 'foo':
..         class Foo[object]:
..             pass
..         return Foo # return the class, not an instance
..     else:
..         class Bar[object]:
..             pass
..         return Bar
...
>>> MyClass = choose_class['foo']
>>> print[MyClass] # the function returns a class, not an instance

>>> print[MyClass[]] # you can create an object from this class

2 ở cấp độ mô-đun

Bằng cách này, tất cả các lớp của mô-đun này sẽ được tạo bằng cách sử dụng siêu dữ liệu này và chúng ta chỉ cần yêu cầu siêu dữ liệu chuyển tất cả các thuộc tính thành chữ hoa

May mắn thay,

>>> def choose_class[name]:
..     if name == 'foo':
..         class Foo[object]:
..             pass
..         return Foo # return the class, not an instance
..     else:
..         class Bar[object]:
..             pass
..         return Bar
...
>>> MyClass = choose_class['foo']
>>> print[MyClass] # the function returns a class, not an instance

>>> print[MyClass[]] # you can create an object from this class

2 thực sự có thể là bất kỳ lớp nào có thể gọi được, nó không cần phải là một lớp chính thức [tôi biết, thứ gì đó có 'lớp' trong tên của nó không cần phải là một lớp, hãy xem. nhưng nó hữu ích]

Vì vậy, chúng ta sẽ bắt đầu với một ví dụ đơn giản, bằng cách sử dụng hàm

>>> 8^3
11
7

Hãy kiểm tra

>>> 8^3
11
8

Bây giờ, hãy làm giống hệt như vậy, nhưng sử dụng một lớp thực cho một siêu dữ liệu

>>> 8^3
11
9

Bây giờ chúng ta hãy viết lại những điều trên, nhưng với các tên biến ngắn hơn và thực tế hơn khi chúng ta biết ý nghĩa của chúng

1000  # 8 [binary]
0011  # 3 [binary]
----  # APPLY XOR ['vertically']
1011  # result = 11 [binary]
0

Bạn có thể đã nhận thấy đối số bổ sung

>>> 0^0
0
>>> 1^1
0
>>> 1^0
1
>>> 0^1
1
01. Không có gì đặc biệt về nó.
>>> 0^0
0
>>> 1^1
0
>>> 1^0
1
>>> 0^1
1
02 luôn nhận lớp mà nó được định nghĩa, làm tham số đầu tiên. Giống như bạn có
>>> 0^0
0
>>> 1^1
0
>>> 1^0
1
>>> 0^1
1
03 cho các phương thức thông thường nhận thể hiện làm tham số đầu tiên hoặc lớp xác định cho các phương thức lớp

Nhưng điều này không đúng OOP. Chúng tôi đang gọi trực tiếp cho ____6_______1 và chúng tôi không ghi đè hoặc gọi cho ____1_______02 của phụ huynh. Hãy làm điều đó thay vào đó

1000  # 8 [binary]
0011  # 3 [binary]
----  # APPLY XOR ['vertically']
1011  # result = 11 [binary]
1

Chúng ta có thể làm cho nó sạch hơn nữa bằng cách sử dụng

>>> 0^0
0
>>> 1^1
0
>>> 1^0
1
>>> 0^1
1
06, điều này sẽ giúp dễ dàng thừa kế [vì vâng, bạn có thể có siêu dữ liệu, kế thừa từ siêu dữ liệu, kế thừa từ loại]

1000  # 8 [binary]
0011  # 3 [binary]
----  # APPLY XOR ['vertically']
1011  # result = 11 [binary]
2

Ồ, và trong Python 3 nếu bạn thực hiện cuộc gọi này với các đối số từ khóa, như thế này

1000  # 8 [binary]
0011  # 3 [binary]
----  # APPLY XOR ['vertically']
1011  # result = 11 [binary]
3

Nó chuyển thành cái này trong siêu dữ liệu để sử dụng nó

1000  # 8 [binary]
0011  # 3 [binary]
----  # APPLY XOR ['vertically']
1011  # result = 11 [binary]
4

Đó là nó. Thực sự không có gì hơn về siêu dữ liệu

Lý do đằng sau sự phức tạp của mã khi sử dụng siêu dữ liệu không phải là do siêu dữ liệu, mà là vì bạn thường sử dụng siêu dữ liệu để thực hiện những thứ phức tạp dựa trên nội quan, thao tác kế thừa, các vars như

>>> 0^0
0
>>> 1^1
0
>>> 1^0
1
>>> 0^1
1
07, v.v.

Thật vậy, siêu dữ liệu đặc biệt hữu ích để thực hiện ma thuật đen, và do đó, những thứ phức tạp. Nhưng bản thân chúng thì đơn giản

  • chặn việc tạo lớp
  • sửa đổi lớp
  • trả lại lớp đã sửa đổi
Tại sao bạn lại sử dụng các lớp siêu dữ liệu thay vì các hàm?

>>> def choose_class[name]:
..     if name == 'foo':
..         class Foo[object]:
..             pass
..         return Foo # return the class, not an instance
..     else:
..         class Bar[object]:
..             pass
..         return Bar
...
>>> MyClass = choose_class['foo']
>>> print[MyClass] # the function returns a class, not an instance

>>> print[MyClass[]] # you can create an object from this class

2 có thể chấp nhận bất kỳ cuộc gọi nào, tại sao bạn lại sử dụng một lớp vì nó rõ ràng là phức tạp hơn?

Có một số lý do để làm như vậy

  • Ý định rõ ràng. Khi bạn đọc
    >>> 0^0
    0
    >>> 1^1
    0
    >>> 1^0
    1
    >>> 0^1
    1
    
    09, bạn biết điều gì sẽ xảy ra tiếp theo
  • Bạn có thể sử dụng OOP. Siêu dữ liệu có thể kế thừa từ siêu dữ liệu, ghi đè các phương thức cha. Siêu dữ liệu thậm chí có thể sử dụng siêu dữ liệu
  • Các lớp con của một lớp sẽ là thể hiện của siêu dữ liệu của nó nếu bạn đã chỉ định một lớp siêu dữ liệu, nhưng không phải với hàm siêu dữ liệu
  • Bạn có thể cấu trúc mã của mình tốt hơn. Bạn không bao giờ sử dụng siêu dữ liệu cho những thứ tầm thường như ví dụ trên. Nó thường dành cho một cái gì đó phức tạp. Có khả năng tạo một số phương thức và nhóm chúng trong một lớp rất hữu ích để làm cho mã dễ đọc hơn
  • Bạn có thể móc vào
    >>> 0^0
    0
    >>> 1^1
    0
    >>> 1^0
    1
    >>> 0^1
    1
    
    02,
    >>> 0^0
    0
    >>> 1^1
    0
    >>> 1^0
    1
    >>> 0^1
    1
    
    11 và
    >>> 0^0
    0
    >>> 1^1
    0
    >>> 1^0
    1
    >>> 0^1
    1
    
    12. Điều này sẽ cho phép bạn làm những việc khác nhau, Ngay cả khi thông thường bạn có thể làm tất cả trong
    >>> 0^0
    0
    >>> 1^1
    0
    >>> 1^0
    1
    >>> 0^1
    1
    
    02, thì một số người vẫn cảm thấy thoải mái hơn khi sử dụng
    >>> 0^0
    0
    >>> 1^1
    0
    >>> 1^0
    1
    >>> 0^1
    1
    
    11
  • Chúng được gọi là siêu dữ liệu, chết tiệt. Nó phải có ý nghĩa gì đó
Tại sao bạn sẽ sử dụng siêu dữ liệu?

Bây giờ câu hỏi lớn. Tại sao bạn lại sử dụng một số tính năng dễ bị lỗi tối nghĩa?

Chà, thường thì bạn không

Siêu dữ liệu là phép thuật sâu sắc hơn mà 99% người dùng không bao giờ phải lo lắng về điều đó. Nếu bạn tự hỏi liệu bạn có cần chúng hay không, thì bạn không cần [những người thực sự cần chúng biết chắc chắn rằng họ cần chúng và không cần lời giải thích tại sao]

Python Guru Tim Peters

Trường hợp sử dụng chính cho siêu dữ liệu là tạo API. Một ví dụ điển hình của điều này là Django ORM. Nó cho phép bạn xác định một cái gì đó như thế này

1000  # 8 [binary]
0011  # 3 [binary]
----  # APPLY XOR ['vertically']
1011  # result = 11 [binary]
5

Nhưng nếu bạn làm điều này

1000  # 8 [binary]
0011  # 3 [binary]
----  # APPLY XOR ['vertically']
1011  # result = 11 [binary]
6

Nó sẽ không trả về một đối tượng

>>> 0^0
0
>>> 1^1
0
>>> 1^0
1
>>> 0^1
1
15. Nó sẽ trả về một
>>> print[ObjectCreator] # you can print a class because it's an object

>>> def echo[o]:
..       print[o]
...
>>> echo[ObjectCreator] # you can pass a class as a parameter

>>> print[hasattr[ObjectCreator, 'new_attribute']]
False
>>> ObjectCreator.new_attribute = 'foo' # you can add attributes to a class
>>> print[hasattr[ObjectCreator, 'new_attribute']]
True
>>> print[ObjectCreator.new_attribute]
foo
>>> ObjectCreatorMirror = ObjectCreator # you can assign a class to a variable
>>> print[ObjectCreatorMirror.new_attribute]
foo
>>> print[ObjectCreatorMirror[]]

6, và thậm chí có thể lấy nó trực tiếp từ cơ sở dữ liệu

Điều này là có thể bởi vì

>>> 0^0
0
>>> 1^1
0
>>> 1^0
1
>>> 0^1
1
17 định nghĩa
>>> def choose_class[name]:
..     if name == 'foo':
..         class Foo[object]:
..             pass
..         return Foo # return the class, not an instance
..     else:
..         class Bar[object]:
..             pass
..         return Bar
...
>>> MyClass = choose_class['foo']
>>> print[MyClass] # the function returns a class, not an instance

>>> print[MyClass[]] # you can create an object from this class

2 và nó sử dụng một số phép thuật sẽ biến
>>> 0^0
0
>>> 1^1
0
>>> 1^0
1
>>> 0^1
1
19 mà bạn vừa xác định bằng các câu lệnh đơn giản thành một móc nối phức tạp với trường cơ sở dữ liệu

Django làm cho thứ gì đó phức tạp trở nên đơn giản bằng cách hiển thị một API đơn giản và sử dụng siêu dữ liệu, tạo lại mã từ API này để thực hiện công việc thực sự đằng sau hậu trường

Lời cuối

Đầu tiên, bạn biết rằng các lớp là các đối tượng có thể tạo các thể hiện

Chà, trên thực tế, bản thân các lớp là các thể hiện. Của siêu dữ liệu

1000  # 8 [binary]
0011  # 3 [binary]
----  # APPLY XOR ['vertically']
1011  # result = 11 [binary]
7

Mọi thứ đều là một đối tượng trong Python và tất cả chúng đều là thể hiện của lớp hoặc thể hiện của siêu dữ liệu

Ngoại trừ

>>> class ObjectCreator[object]:
..       pass
...
1

>>> class ObjectCreator[object]:
..       pass
...
1 thực sự là siêu dữ liệu của chính nó. Đây không phải là thứ bạn có thể sao chép bằng Python thuần túy và được thực hiện bằng cách gian lận một chút ở cấp độ triển khai

Thứ hai, siêu dữ liệu phức tạp. Bạn có thể không muốn sử dụng chúng để thay đổi lớp rất đơn giản. Bạn có thể thay đổi các lớp bằng cách sử dụng hai kỹ thuật khác nhau

  • khỉ vá
  • trang trí lớp học

99% thời gian bạn cần thay đổi lớp, tốt hơn hết bạn nên sử dụng những thứ này

Nhưng 98% thời gian, bạn hoàn toàn không cần thay đổi lớp học

Python – Từ khóa “yield” làm gì

Để hiểu những gì

>>> 0^0
0
>>> 1^1
0
>>> 1^0
1
>>> 0^1
1
22 làm, bạn phải hiểu máy phát điện là gì. Và trước khi bạn có thể hiểu về máy phát điện, bạn phải hiểu về iterables

Iterables

Khi bạn tạo một danh sách, bạn có thể đọc từng mục một. Đọc từng mục của nó được gọi là lặp lại

1000  # 8 [binary]
0011  # 3 [binary]
----  # APPLY XOR ['vertically']
1011  # result = 11 [binary]
8

>>> 0^0
0
>>> 1^1
0
>>> 1^0
1
>>> 0^1
1
23 là một lần lặp. Khi bạn sử dụng khả năng hiểu danh sách, bạn tạo một danh sách và do đó, một danh sách có thể lặp lại

1000  # 8 [binary]
0011  # 3 [binary]
----  # APPLY XOR ['vertically']
1011  # result = 11 [binary]
9

Mọi thứ bạn có thể sử dụng "

>>> 0^0
0
>>> 1^1
0
>>> 1^0
1
>>> 0^1
1
24" đều có thể lặp lại;

Các lần lặp này rất tiện lợi vì bạn có thể đọc chúng bao nhiêu tùy thích, nhưng bạn lưu trữ tất cả các giá trị trong bộ nhớ và điều này không phải lúc nào bạn cũng muốn khi bạn có nhiều giá trị

máy phát điện

Trình tạo là trình lặp, một loại có thể lặp lại mà bạn chỉ có thể lặp lại một lần. Trình tạo không lưu trữ tất cả các giá trị trong bộ nhớ, chúng tạo ra các giá trị một cách nhanh chóng

>>> class ObjectCreator[object]:
..       pass
...

>>> my_object = ObjectCreator[]
>>> print[my_object]

0

Nó giống nhau ngoại trừ bạn đã sử dụng

>>> 0^0
0
>>> 1^1
0
>>> 1^0
1
>>> 0^1
1
27 thay vì
>>> 0^0
0
>>> 1^1
0
>>> 1^0
1
>>> 0^1
1
28. NHƯNG, bạn không thể thực hiện
>>> 0^0
0
>>> 1^1
0
>>> 1^0
1
>>> 0^1
1
29 lần thứ hai vì máy phát điện chỉ có thể được sử dụng một lần. họ tính 0, sau đó quên nó đi và tính 1, và cuối cùng tính 4, từng người một

năng suất

>>> 0^0
0
>>> 1^1
0
>>> 1^0
1
>>> 0^1
1
22 là một từ khóa được sử dụng như
>>> 0^0
0
>>> 1^1
0
>>> 1^0
1
>>> 0^1
1
31, ngoại trừ hàm sẽ trả về một trình tạo

>>> class ObjectCreator[object]:
..       pass
...

>>> my_object = ObjectCreator[]
>>> print[my_object]

1

Đây là một ví dụ vô ích, nhưng sẽ rất hữu ích khi bạn biết hàm của mình sẽ trả về một tập hợp giá trị khổng lồ mà bạn chỉ cần đọc một lần

Để thành thạo

>>> 0^0
0
>>> 1^1
0
>>> 1^0
1
>>> 0^1
1
22, bạn phải hiểu rằng khi bạn gọi hàm, mã bạn đã viết trong thân hàm không chạy. Hàm chỉ trả về đối tượng trình tạo, điều này hơi phức tạp

Sau đó, mã của bạn sẽ tiếp tục từ nơi nó dừng lại mỗi khi

>>> 0^0
0
>>> 1^1
0
>>> 1^0
1
>>> 0^1
1
33 sử dụng trình tạo

Bây giờ là phần khó khăn

Lần đầu tiên

>>> 0^0
0
>>> 1^1
0
>>> 1^0
1
>>> 0^1
1
33 gọi đối tượng trình tạo được tạo từ hàm của bạn, nó sẽ chạy mã trong hàm của bạn ngay từ đầu cho đến khi chạm tới
>>> 0^0
0
>>> 1^1
0
>>> 1^0
1
>>> 0^1
1
22, sau đó nó sẽ trả về giá trị đầu tiên của vòng lặp. Sau đó, mỗi lệnh gọi tiếp theo sẽ chạy một lần lặp khác của vòng lặp mà bạn đã viết trong hàm và trả về giá trị tiếp theo. Điều này sẽ tiếp tục cho đến khi trình tạo được coi là trống, điều này xảy ra khi chức năng chạy mà không nhấn
>>> 0^0
0
>>> 1^1
0
>>> 1^0
1
>>> 0^1
1
22. Đó có thể là do vòng lặp đã kết thúc hoặc do bạn không còn thỏa mãn một
>>> 0^0
0
>>> 1^1
0
>>> 1^0
1
>>> 0^1
1
37

mã của bạn giải thích

Máy phát điện

>>> class ObjectCreator[object]:
..       pass
...

>>> my_object = ObjectCreator[]
>>> print[my_object]

2

người gọi

>>> class ObjectCreator[object]:
..       pass
...

>>> my_object = ObjectCreator[]
>>> print[my_object]

3

Mã này chứa một số phần thông minh

  • Vòng lặp lặp lại trên một danh sách, nhưng danh sách mở rộng trong khi vòng lặp đang được lặp lại. Đó là một cách ngắn gọn để xem qua tất cả các dữ liệu lồng nhau này ngay cả khi nó hơi nguy hiểm vì bạn có thể kết thúc bằng một vòng lặp vô hạn. Trong trường hợp này,

    >>> 0^0
    0
    >>> 1^1
    0
    >>> 1^0
    1
    >>> 0^1
    1
    
    38 làm cạn kiệt tất cả các giá trị của trình tạo, nhưng
    >>> 0^0
    0
    >>> 1^1
    0
    >>> 1^0
    1
    >>> 0^1
    1
    
    39 tiếp tục tạo các đối tượng trình tạo mới sẽ tạo ra các giá trị khác với các giá trị trước đó do nó không được áp dụng trên cùng một nút

  • Phương thức

    >>> 0^0
    0
    >>> 1^1
    0
    >>> 1^0
    1
    >>> 0^1
    1
    
    40 là một phương thức đối tượng danh sách mong đợi một lần lặp và thêm các giá trị của nó vào danh sách

Thông thường chúng ta chuyển một danh sách cho nó

>>> class ObjectCreator[object]:
..       pass
...

>>> my_object = ObjectCreator[]
>>> print[my_object]

4

Nhưng trong mã của bạn, nó có một trình tạo, điều này tốt bởi vì

  1. Bạn không cần phải đọc các giá trị hai lần
  2. Bạn có thể có rất nhiều con và bạn không muốn tất cả chúng được lưu trong bộ nhớ

Và nó hoạt động vì Python không quan tâm liệu đối số của phương thức có phải là danh sách hay không. Python mong đợi các lần lặp để nó sẽ hoạt động với các chuỗi, danh sách, bộ dữ liệu và trình tạo. Đây được gọi là cách gõ vịt và là một trong những lý do tại sao Python rất tuyệt. Nhưng đây là một câu chuyện khác, cho một câu hỏi khác

Bạn có thể dừng tại đây hoặc đọc một chút để xem cách sử dụng nâng cao của trình tạo

Kiểm soát cạn kiệt máy phát điện

>>> class ObjectCreator[object]:
..       pass
...

>>> my_object = ObjectCreator[]
>>> print[my_object]

5

Ghi chú. Đối với Python 3, sử dụng_______1_______41 hoặc

>>> 0^0
0
>>> 1^1
0
>>> 1^0
1
>>> 0^1
1
42

Nó có thể hữu ích cho nhiều thứ khác nhau như kiểm soát quyền truy cập vào tài nguyên

Itertools, người bạn tốt nhất của bạn

Mô-đun itertools chứa các chức năng đặc biệt để thao tác với các lần lặp. Bạn đã bao giờ muốn sao chép một máy phát điện chưa?

Sau đó, chỉ cần

>>> 0^0
0
>>> 1^1
0
>>> 1^0
1
>>> 0^1
1
44

Một ví dụ?

>>> class ObjectCreator[object]:
..       pass
...

>>> my_object = ObjectCreator[]
>>> print[my_object]

6

Hiểu các cơ chế bên trong của phép lặp

Lặp lại là một quá trình ngụ ý có thể lặp lại [triển khai phương thức

>>> 0^0
0
>>> 1^1
0
>>> 1^0
1
>>> 0^1
1
45] và trình vòng lặp [triển khai phương thức
>>> 0^0
0
>>> 1^1
0
>>> 1^0
1
>>> 0^1
1
46]. Iterables là bất kỳ đối tượng nào bạn có thể lấy một iterator từ. Iterators là đối tượng cho phép bạn lặp lại trên iterables

Toán tử mũ trong Python là gì?

Đó là xOR bitwise [OR độc quyền] . Nó đánh giá là True khi và chỉ khi các đối số của nó khác nhau [một là True , cái kia là False ].

7 toán tử trong Python là gì?

Toán tử Python .
toán tử số học
Toán tử gán
Toán tử so sánh
Toán tử logic
Toán tử nhận dạng
nhà khai thác thành viên
Toán tử bitwise

Toán tử dấu mũ là gì?

Dấu mũ được sử dụng trong các ngôn ngữ lập trình khác nhau để biểu thị toán tử XOR, ký tự điều khiển và nối chuỗi . Nó vẫn được sử dụng trong các biểu thức thông thường, để đánh dấu phần đầu của một dòng hoặc chuỗi. Pascal sử dụng dấu mũ để khai báo con trỏ.

%= có phải là toán tử trong Python không?

Ở đây, = là toán tử gán gán 5 cho x. Đây là danh sách các toán tử gán khác nhau có sẵn trong Python. . 2. Toán tử gán trong Python

Chủ Đề