Hướng dẫn reset object python - đặt lại đối tượng python

("Biến" ở đây đề cập đến "tên", tôi nghĩ, không hoàn toàn chắc chắn về việc sử dụng Pythonistas định nghĩa)

Tôi có một đối tượng và một số phương pháp. Các phương pháp này đều cần và tất cả thay đổi các biến của đối tượng. Làm thế nào tôi có thể, trong pythonic nhất và tốt nhất, tôn trọng các kỹ thuật của OOP, cách đạt được để có các biến đối tượng được sử dụng bởi các phương thức nhưng cũng giữ các giá trị ban đầu của chúng cho các phương thức khác?

Tôi có nên sao chép đối tượng mỗi khi một phương thức được gọi không? Tôi có nên lưu các giá trị ban đầu và có phương thức đặt lại () để đặt lại chúng mỗi khi một phương thức cần chúng không? Hay là có một cách thậm chí tốt hơn?

EDIT: Tôi đã được yêu cầu mã giả. Vì tôi quan tâm nhiều hơn đến việc hiểu khái niệm hơn là chỉ giải quyết cụ thể vấn đề tôi gặp phải nên tôi sẽ thử đưa ra một ví dụ: I was asked for pseudocode. Since I am more interested in understanding the concept rather than just specifically solving the problem I am encountering I am going to try give an example:

class Player():
    games = 0
    points = 0
    fouls = 0
    rebounds = 0
    assists = 0
    turnovers = 0
    steals = 0

    def playCupGame(self):
        # simulates a game and then assigns values to the variables, accordingly
        self.points = K #just an example

    def playLeagueGame(self):
        # simulates a game and then assigns values to the variables, accordingly
        self.points = Z #just an example
        self.rebounds = W #example again

    def playTrainingGame(self):
        # simulates a game and then assigns values to the variables, accordingly
        self.points = X #just an example
        self.rebounds = Y #example again

Trên đây là lớp của tôi cho một đối tượng người chơi (ví dụ giả sử anh ấy là một bóng rổ). Đối tượng này có ba phương pháp khác nhau mà tất cả đều gán các giá trị cho số liệu thống kê của người chơi.

Vì vậy, giả sử đội có hai trận đấu và sau đó là một trò chơi Cup. Tôi phải thực hiện các cuộc gọi sau:

p.playLeagueGame()
p.playLeagueGame()
p.playCupGame()

Rõ ràng là khi cuộc gọi thứ hai và thứ ba được thực hiện, số liệu thống kê đã thay đổi trước đây của người chơi cần được đặt lại. Đối với điều đó, tôi có thể viết một phương thức đặt lại đặt tất cả các biến trở lại 0 hoặc sao chép đối tượng cho mỗi cuộc gọi tôi thực hiện. Hoặc làm một cái gì đó hoàn toàn khác.

Đó là nơi câu hỏi của tôi đặt ra, cách tiếp cận tốt nhất, Python và OOP khôn ngoan là gì?

CẬP NHẬT: Tôi nghi ngờ rằng tôi đã siêu âm này và tôi có thể dễ dàng giải quyết vấn đề của mình bằng cách sử dụng các biến cục bộ trong các chức năng. Tuy nhiên, điều gì xảy ra nếu tôi có một hàm bên trong một hàm khác, tôi có thể sử dụng người dân địa phương bên ngoài bên trong bên trong không? I am suspicious that I have superovercomplicated this and I can easily solve my problem by using local variables in the functions. However, what happens if I have a function inside another function, can I use locals of the outer one inside the inner one?

Đã đăng vào thg 5 17, 2019 5:41 CH 5 phút đọc 5 phút đọc

Chào tất cả mọi người. Ở bài viết trước mình đã giới thiệu cho các bạn về hàm và cách sử dụng của nó. Hôm nay mình sẽ giới thiệu cho các bạn một khái niệm rất là quen thuộc với những ai yêu mến OOP (Object Oriented Programming). Exactly! It is Class and Object. Để có thể hiểu rõ hết những gì mình sắp trình bày, các bạn mới xem lần đầu có thể đọc các bài viết trước của mình về Python nhé:
Để có thể hiểu rõ hết những gì mình sắp trình bày, các bạn mới xem lần đầu có thể đọc các bài viết trước của mình về Python nhé:

  • Python Language
  • Cấu trúc rẽ nhánh trong Python
  • Hàm trong Python Không dài dòng nữa, chúng ta bắt đầu tìm hiểu nào.
    Không dài dòng nữa, chúng ta bắt đầu tìm hiểu nào.

Khái niệm

Python là một ngôn ngữ hướng đối tượng. Vì vậy hầu hết mọi thứ trong Python đều là những đối tượng với những thuộc tính (properties) và phương thức (methods) riêng. OOP có 3 tính chất cơ bản các bạn cần phải nắm đó là:
OOP có 3 tính chất cơ bản các bạn cần phải nắm đó là:

  • Tính đóng gói.
  • Tính kế thừa.
  • Tính đa hình.

Còn chi tiết cụ thể mỗi tính chất các bạn có thể search for google nhá. Túm lại, theo cách hiểu của mình (sau khi đã gu gồ dịch) thì class nó là như thế này: "Một Class giống như một hàm tạo đối tượng hoặc một "bản thiết kế" để tạo các đối tượng".
Túm lại, theo cách hiểu của mình (sau khi đã gu gồ dịch) thì class nó là như thế này: "Một Class giống như một hàm tạo đối tượng hoặc một "bản thiết kế" để tạo các đối tượng".

Tạo một class

Để tạo một class các bạn sử dụng từ khóa "class" theo cấu trúc như sau:

class ClassName:
    [listOfProperties here]
    [listOfMethods here]

Ví dụ: Sau đây mình sẽ tạo một class Student có các thuộc tính là (name, age, math, literature, english) cùng với các phương thức như getName(), getAge(), getAverage().

class Student:
    def __init__ (self, name, age, math, literature, english):
        self.name = name
        self.age = age
        self.math = math
        self.literature = literature
        self.english = english
        
    def getName(self):
        return self.name
        
    def getAge(self):
        return self.age
        
    def getAverage(self):
        return (self.math + self.literature + self.english) / 3

Như các bạn đã thấy, ở trên mình có sử dụng phương thức rất là đặc biệt __init__(self, args). Vậy nó là gì vậy, và có cần thiết để sử dụng trong class hay không?

Phương thức khởi tạo __init__(self, args)

  • Phương thức khởi tạo (Constructor) là một phương thức đặc biệt của lớp (class), nó luôn có tên là __init__.
  • Tham số đầu tiên của constructor luôn là self (Một từ khóa ám chỉ chính class đó).
  • Constructor được sử dụng để tạo ra một đối tượng.
  • Constructor gán các giá trị từ tham số vào các thuộc tính của đối tượng sẽ được tạo ra.
  • Bạn chỉ có thể định nghĩa nhiều nhất một phương thức khởi tạo (constructor) trong class.
  • Nếu class không được định nghĩa constructor, Python mặc định coi rằng nó thừa kết từ constructor của lớp cha.

Và cuối cùng, chúng ta có thể không cần dùng phương thức khởi tạo để gán giá trị cho các properties của class vì nó không cần thiết. Nhưng trong những dự án thực tế thì điều này lại tỏ ra rất cần thiết bởi vì code của chúng ta sẽ trở nên rõ ràng và dễ đọc hơn nhiều.

Khởi tạo đối tượng từ class

Để khởi tạo một đối tượng từ class ta thực hiện theo cấu trúc sau:

nameOfObject = nameOfClass([args])

VÍ dụ: Mình sẽ tạo một đối tượng student từ class Student đã được tạo ra ở phần trên.

student = Student('Jake', 24, 85, 90, 77)

Trên đây là những gì mình biết về class và object. Các bạn có cảm thấy hoang mang không nhỉ? Nếu có thì đừng lo lắng gì cả. Sau đây mình sẽ làm một ví dụ về việc sử dụng class và object trong Python ngay bây giờ.

Ví dụ minh họa

Trong ví dụ này mình sẽ sử dụng class Student ở trên kết hợp với List trong Python để làm một chương trình quản lý học sinh đơn giản. Dưới đây là code đầy đủ của class Student.


Các bạn lưu vào file student.py nhé. Còn đây là code trong file main.py của mình.
Còn đây là code trong file main.py của mình.


Để sử dụng được class Student đã viết trong file student.py thì các bạn dùng cặp từ khóa from và import nhé. Trong này mình có import thêm random dùng để tạo số ngẫu nhiên. Cái này mình sẽ trình bày sau nếu có thời gian. Và đây là demo của mình: fromimport nhé. Trong này mình có import thêm random dùng để tạo số ngẫu nhiên. Cái này mình sẽ trình bày sau nếu có thời gian.
Và đây là demo của mình:


Kết luận

Vậy là qua bài viết hôm nay mình đã trình bày cho các bạn hiểu rõ về class cũng như cách sử dụng class để tạo nên đối tượng ứng dụng trong chính dự án của các bạn. Bài viết sau mình sẽ cố gắng trình bày thêm về phần class nâng cao hơn. Hy vọng các bạn sẽ tiếp tục theo dõi và ủng hộ. Thank you very much.
Bài viết sau mình sẽ cố gắng trình bày thêm về phần class nâng cao hơn. Hy vọng các bạn sẽ tiếp tục theo dõi và ủng hộ. Thank you very much.

All rights reserved