Các phím tắt hướng đối tượng

Chương này nói chi tiết về các hàm tích hợp sẵn khác nhau trong Python, các thao tác nhập / xuất tệp và các khái niệm nạp chồng.

Các hàm tích hợp trong Python

Trình thông dịch Python có một số hàm được gọi là hàm tích hợp sẵn có sẵn để sử dụng. Trong phiên bản mới nhất của nó, Python chứa 68 hàm tích hợp như được liệt kê trong bảng dưới đây:

CHỨC NĂNG TÍCH HỢP SẴN
abs () dict () Cứu giúp() min () setattr ()
tất cả() dir () hex () kế tiếp() lát ()
bất kì() divmod () Tôi() vật() đã sắp xếp ()
ascii () liệt kê () đầu vào() oct () staticmethod ()
thùng rác() eval () int () mở() str ()
bool () hành () isinstance () ord () Tổng()
bytearray () bộ lọc () Issubclass () pow () siêu()
byte () Phao nổi() iter () in() tuple ()
callable () định dạng() len () bất động sản() kiểu()
chr () frozenset () danh sách() phạm vi() vars ()
classmethod () getattr () người dân địa phương () repr () zip ()
biên dịch () hình cầu () bản đồ() đảo ngược () __import __ ()
phức tạp() hasattr () max () tròn()
delattr () băm () memoryview () bộ()

Phần này thảo luận ngắn gọn về một số chức năng quan trọng -

hàm len ()

Hàm len () lấy độ dài của chuỗi, danh sách hoặc tập hợp. Nó trả về độ dài hoặc số lượng mục của một đối tượng, trong đó đối tượng có thể là một chuỗi, danh sách hoặc một tập hợp.

>>> len(['hello', 9 , 45.0, 24])
4

Hàm len () hoạt động bên trong như list.__len__() hoặc là tuple.__len__(). Vì vậy, lưu ý rằng len () chỉ hoạt động trên các đối tượng có __len__() phương pháp.

>>> set1
{1, 2, 3, 4}
>>> set1.__len__()
4

Tuy nhiên, trong thực tế, chúng tôi thích len() thay cho __len__() hoạt động vì những lý do sau:

  • Nó hiệu quả hơn. Và không nhất thiết phải viết một phương thức cụ thể để từ chối quyền truy cập vào các phương thức đặc biệt như __len__.

  • Nó rất dễ dàng để bảo trì.

  • Nó hỗ trợ khả năng tương thích ngược.

Đã đảo ngược (seq)

Nó trả về trình lặp ngược. seq phải là một đối tượng có phương thức __reversed __ () hoặc hỗ trợ giao thức trình tự (phương thức __len __ () và phương thức __getitem __ ()). Nó thường được sử dụng trongfor vòng lặp khi chúng ta muốn lặp lại các mục từ sau ra trước.

>>> normal_list = [2, 4, 5, 7, 9]
>>>
>>> class CustomSequence():
   def __len__(self):
      return 5
   def __getitem__(self,index):
      return "x{0}".format(index)
>>> class funkyback():
   def __reversed__(self):
      return 'backwards!'
>>> for seq in normal_list, CustomSequence(), funkyback():
      print('\n{}: '.format(seq.__class__.__name__), end="")
      for item in reversed(seq):
         print(item, end=", ")

Vòng lặp for ở cuối in ra danh sách đảo ngược của một danh sách bình thường và các trường hợp của hai chuỗi tùy chỉnh. Kết quả cho thấyreversed() hoạt động trên cả ba trong số chúng, nhưng có kết quả rất khác khi chúng tôi xác định __reversed__.

Đầu ra

Bạn có thể quan sát kết quả sau khi thực thi đoạn mã được đưa ra ở trên:

list: 9, 7, 5, 4, 2,
CustomSequence: x4, x3, x2, x1, x0,
funkyback: b, a, c, k, w, a, r, d, s, !,

Liệt kê

Các enumerate () phương thức thêm một bộ đếm vào một có thể lặp lại và trả về đối tượng liệt kê.

Cú pháp của enumerate () là -

enumerate(iterable, start = 0)

Đây là đối số thứ hai start là tùy chọn và theo mặc định chỉ mục bắt đầu bằng không (0).

>>> # Enumerate
>>> names = ['Rajesh', 'Rahul', 'Aarav', 'Sahil', 'Trevor']
>>> enumerate(names)
<enumerate object at 0x031D9F80>
>>> list(enumerate(names))
[(0, 'Rajesh'), (1, 'Rahul'), (2, 'Aarav'), (3, 'Sahil'), (4, 'Trevor')]
>>>

Vì thế enumerate()trả về một trình lặp tạo ra một bộ lưu giữ số lượng các phần tử trong chuỗi được truyền. Vì giá trị trả về là một trình lặp nên việc truy cập trực tiếp vào nó không hữu ích lắm. Một cách tiếp cận tốt hơn cho enumerate () là giữ số lượng trong vòng lặp for.

>>> for i, n in enumerate(names):
   print('Names number: ' + str(i))
   print(n)
Names number: 0
Rajesh
Names number: 1
Rahul
Names number: 2
Aarav
Names number: 3
Sahil
Names number: 4
Trevor

Có nhiều hàm khác trong thư viện chuẩn và đây là một danh sách khác về một số hàm được sử dụng rộng rãi hơn -

  • hasattr, getattr, setattrdelattr, cho phép các thuộc tính của một đối tượng được điều khiển bởi tên chuỗi của chúng.

  • allany, chấp nhận một đối tượng có thể lặp lại và trả về True nếu tất cả hoặc bất kỳ mục nào được đánh giá là đúng.

  • nzip, lấy hai hoặc nhiều trình tự và trả về một chuỗi các bộ giá trị mới, trong đó mỗi bộ giá trị chứa một giá trị duy nhất từ ​​mỗi chuỗi.

Tệp I / O

Khái niệm tệp gắn liền với thuật ngữ lập trình hướng đối tượng. Python đã bao bọc giao diện mà hệ điều hành cung cấp dưới dạng trừu tượng cho phép chúng ta làm việc với các đối tượng tệp.

Các open()hàm tích hợp được sử dụng để mở một tệp và trả về một đối tượng tệp. Đây là hàm được sử dụng phổ biến nhất với hai đối số:

open(filename, mode)

Hàm open () gọi hai đối số, đầu tiên là tên tệp và thứ hai là chế độ. Chế độ ở đây có thể là 'r' cho chế độ chỉ đọc, 'w' để chỉ ghi (tệp hiện có có cùng tên sẽ bị xóa) và 'a' mở tệp để thêm vào, mọi dữ liệu được ghi vào tệp sẽ tự động được thêm vào đến cuối cùng. 'r +' mở tệp để đọc và ghi. Chế độ mặc định là chỉ đọc.

Trên windows, 'b' được thêm vào chế độ sẽ mở tệp ở chế độ nhị phân, vì vậy cũng có các chế độ như 'rb', 'wb' và 'r + b'.

>>> text = 'This is the first line'
>>> file = open('datawork','w')
>>> file.write(text)
22
>>> file.close()

Trong một số trường hợp, chúng tôi chỉ muốn thêm vào tệp hiện có thay vì ghi đè nó, vì điều đó chúng tôi có thể cung cấp giá trị 'a' làm đối số chế độ, để nối vào cuối tệp, thay vì ghi đè hoàn toàn tệp hiện có các nội dung.

>>> f = open('datawork','a')
>>> text1 = ' This is second line'
>>> f.write(text1)
20
>>> f.close()

Khi tệp được mở để đọc, chúng ta có thể gọi phương thức read, readline hoặc readlines để lấy nội dung của tệp. Phương thức read trả về toàn bộ nội dung của tệp dưới dạng đối tượng str hoặc byte, tùy thuộc vào đối số thứ hai có phải là 'b' hay không.

Để dễ đọc và tránh đọc một tệp lớn trong một lần, tốt hơn là sử dụng vòng lặp for trực tiếp trên một đối tượng tệp. Đối với các tệp văn bản, nó sẽ đọc từng dòng, từng dòng một và chúng ta có thể xử lý nó bên trong thân vòng lặp. Tuy nhiên, đối với các tệp nhị phân, tốt hơn là đọc các phần dữ liệu có kích thước cố định bằng phương thức read (), truyền một tham số cho số byte tối đa để đọc.

>>> f = open('fileone','r+')
>>> f.readline()
'This is the first line. \n'
>>> f.readline()
'This is the second line. \n'

Việc ghi vào tệp, thông qua phương thức ghi trên các đối tượng tệp sẽ ghi một đối tượng chuỗi (byte đối với dữ liệu nhị phân) vào tệp. Phương thức writelines chấp nhận một chuỗi các chuỗi và ghi từng giá trị được lặp vào tệp. Phương thức writelines không nối thêm một dòng mới sau mỗi mục trong chuỗi.

Cuối cùng, phương thức close () sẽ được gọi khi chúng ta đọc hoặc ghi tệp xong, để đảm bảo mọi lần ghi trong bộ đệm đều được ghi vào đĩa, rằng tệp đã được dọn dẹp đúng cách và tất cả các tài nguyên gắn liền với tệp được giải phóng trở lại hệ điều hành. Đó là một cách tiếp cận tốt hơn để gọi phương thức close () nhưng về mặt kỹ thuật, điều này sẽ tự động xảy ra khi tập lệnh tồn tại.

Một giải pháp thay thế cho quá tải phương thức

Nạp chồng phương thức đề cập đến việc có nhiều phương thức có cùng tên chấp nhận các tập đối số khác nhau.

Với một phương thức hoặc một hàm duy nhất, chúng ta có thể tự chỉ định số lượng tham số. Tùy thuộc vào định nghĩa hàm, nó có thể được gọi với không, một, hai hoặc nhiều tham số.

class Human:
   def sayHello(self, name = None):
      if name is not None:
         print('Hello ' + name)
      else:
         print('Hello ')

#Create Instance
obj = Human()

#Call the method, else part will be executed
obj.sayHello()

#Call the method with a parameter, if part will be executed
obj.sayHello('Rahul')

Đầu ra

Hello
Hello Rahul

Đối số mặc định

Chức năng cũng là đối tượng

Một đối tượng có thể gọi là một đối tượng có thể chấp nhận một số đối số và có thể sẽ trả về một đối tượng. Một hàm là đối tượng có thể gọi đơn giản nhất trong Python, nhưng có những đối tượng khác giống như các lớp hoặc các cá thể lớp nhất định.

Mọi hàm trong Python là một đối tượng. Đối tượng có thể chứa các phương thức hoặc hàm nhưng đối tượng không nhất thiết phải là một hàm.

def my_func():
   print('My function was called')
my_func.description = 'A silly function'
def second_func():

   print('Second function was called')

   second_func.description = 'One more sillier function'

def another_func(func):
   print("The description:", end=" ")
   print(func.description)
   print('The name: ', end=' ')
   print(func.__name__)
   print('The class:', end=' ')
   print(func.__class__)
   print("Now I'll call the function passed in")
   func()

another_func(my_func)
another_func(second_func)

Trong đoạn mã trên, chúng ta có thể chuyển hai hàm khác nhau làm đối số vào hàm thứ ba và nhận được Đầu ra khác nhau cho mỗi hàm -

The description: A silly function
The name: my_func
The class: 
      
        Now I'll call the function passed in My function was called The description: One more sillier function The name: second_func The class: 
       
         Now I'll call the function passed in Second function was called 
       
      

callable objects

Just as functions are objects that can have attributes set on them, it is possible to create an object that can be called as though it were a function.

In Python any object with a __call__() method can be called using function-call syntax.