Hướng dẫn python change an attribute value - python thay đổi một giá trị thuộc tính

Điều gì xảy ra tại dấu chấm.

Hình ảnh lịch sự của unplash qua @joannakosinska

Giới thiệu

Tính toàn vẹn dữ liệu có thể được bảo mật bằng cách kiểm soát các giá trị thuộc tính và quyền truy cập của chúng. Khi một lớp được tạo, chúng tôi có thể muốn đảm bảo tất cả các đối tượng trong tương lai có các thuộc tính của kiểu dữ liệu chính xác và/hoặc của các giá trị hợp lý/phù hợp. Chúng tôi cũng có thể muốn đảm bảo một khi các thuộc tính được đặt giá trị của chúng không thể được thay đổi hoặc xóa. Để đạt được điều này, các thuộc tính bằng chứng chỉ đọc và xóa phải được tạo.

Một lớp nhân viên, chấp nhận tên, tuổi và thời gian dịch vụ như đối số, có thể muốn đảm bảo rằng tên này là một chuỗi, và độ tuổi và độ dài của dịch vụ là số nguyên trước khi chúng được đặt làm thuộc tính trong các đối tượng được tạo. Lớp này cũng có thể muốn đảm bảo các thuộc tính như tên không thể bị thay đổi hoặc xóa.

Xác thực thuộc tính có thể giúp đảm bảo nhập dữ liệu hợp lệ, ngay cả trong trường hợp người dùng của lớp có thể nhập ít hơn thông tin người dùng lý tưởng, ví dụ, một tên trong chữ thường. Bài viết hướng dẫn này sẽ khám phá 5 cách khác nhau để đảm bảo xác thực thuộc tính, cụ thể là thông qua các phương thức và trang trí ma thuật/dunder. Tính toàn vẹn thuộc tính rất quan trọng khi bản thân các thuộc tính được sử dụng trong các phương thức được xác định trong lớp. Đây là lý do tại sao, trước khi một thuộc tính được đặt trong một đối tượng, giá trị của nó phải được kiểm tra.

Ví dụ 1: Dunder __setattr_, __delattr__

Các phương thức Magic hoặc Dunder __setattr_ và__Delattr__ trong Python đại diện cho một cách mà lập trình viên có thể thực hiện kiểm soát các thuộc tính. Để minh họa, hãy khởi tạo một lớp có tên là nhân viên. Lớp này sẽ lấy 3 đối số và đặt chúng làm thuộc tính trong các đối tượng.

Để giới thiệu cách chúng ta có thể kiểm soát các thuộc tính, hãy thiết lập hành vi mà chúng ta muốn thực hiện cho đối tượng nhân viên của mình.

  1. Thuộc tính _name & nbsp; giá trị, nên được viết hoa, bất kể người dùng có chọn nhập thuộc tính tên ở định dạng viết hoa hay không.
  2. Thuộc tính _NAME chỉ được phép được đặt một lần. Thuộc tính tên sẽ trở thành chỉ đọc một khi nó được đặt.
  3. Các thuộc tính _AGE và _Service_length phải là số nguyên. Nếu chúng không phải là một ngoại lệ loại sẽ được nâng lên.
  4. Thuộc tính _name không thể bị xóa

Dunder __setattr__

Phương thức Dunder SetAttr lấy đối tượng và khóa và giá trị chúng ta muốn đặt trong đối tượng làm đối số. Trước tiên, chúng tôi kiểm tra xem đối tượng có thuộc tính ‘_name, đã có thuộc tính, tên không. Nếu có, chúng tôi sẽ nâng một thuộc tínhRorror vì chúng tôi không muốn thuộc tính tên được đặt lại. Trong câu lệnh ELIF sau đây, nếu đối tượng không có thuộc tính tên, chúng tôi sẽ đặt nó và tận dụng nó bằng phương thức tiêu đề chuỗi.

Trong câu lệnh IF đầu tiên, trước tiên chúng tôi kiểm tra xem thuộc tính này, ‘_name đã được đặt. Nếu nó đã được đặt trong phương thức __init__, người dùng sẽ không thể đặt lại nó và sau đó nó sẽ trở thành thuộc tính chỉ đọc.

Logic trong các khối IF và Elif đầu tiên của phương thức SETATTR giải quyết các điểm 1 và 2 ở trên. Bây giờ, hãy kiểm tra kiểu dữ liệu của các thuộc tính độ tuổi và độ dài dịch vụ cho điểm số 3.

Đối với cả ‘_age, và các thuộc tính‘ _service_length, chúng tôi kiểm tra chúng thuộc loại int, sử dụng hàm python isinstance tích hợp. Nếu chúng thuộc bất kỳ loại nào ngoài INT, một ngoại lệ kiểu kiểu sẽ được nâng lên.

Cuối cùng, hãy để địa chỉ điểm 4 và thực hiện mã để ngăn chặn việc xóa thuộc tính tên. Để tranh luận, giả sử rằng, một khi tên đã được đặt, nó không thể bị xóa và tồn tại vĩnh viễn.

Do đó, khi chúng tôi cố gắng xóa thuộc tính tên khỏi đối tượng của chúng tôi, một ngoại lệ thuộc tính sẽ được nêu ra, thông báo cho người dùng, rằng thuộc tính không thể bị xóa. Dưới mui xe, từ khóa DEL gọi phương thức __delattr__. Vì chúng tôi đã xác định nó trong lớp của chúng tôi, nó sẽ gọi phiên bản tùy chỉnh của chúng tôi là __delattr__. Tuy nhiên, chúng tôi sẽ vẫn cho phép hành vi cho phép xóa bất kỳ thuộc tính nào khác.

Để lưu ý, trong các đoạn mã được hiển thị, chúng tôi đã đặt và xóa các thuộc tính như được hiển thị bên dưới để tránh các lỗi đệ quy.

Mã cho lớp nhân viên của chúng tôi được hiển thị bên dưới thông qua GITHUB GIST và có sẵn thông qua liên kết này.

Để kiểm tra hành vi tùy chỉnh mà chúng tôi đã thực hiện, hãy tạo một thể hiện của lớp nhân viên và kiểm tra xem có thể đặt thuộc tính tên hay không, không thể được đặt lại và không thể xóa. Ngoài ra, chúng tôi có thể kiểm tra loại thuộc tính độ tuổi và độ dài dịch vụ.

Thiết lập lại thuộc tính tên không thành công và thông báo cho người dùng tại sao chương trình chấm dứt.

Khi chúng ta lặp qua từ điển của các thuộc tính và in loại của chúng, chúng ta có thể thấy độ tuổi và độ dài của dịch vụ thuộc loại int.

Cuối cùng, khi chúng tôi cố gắng xóa tên thuộc tính, một ngoại lệ thuộc tính được nêu ra, với thông báo chuỗi thông báo cho người dùng rằng thuộc tính không thể bị xóa.

Bây giờ chúng tôi đã thành công trong việc ban hành hành vi tùy chỉnh mà chúng tôi mong muốn. Mặc dù các ví dụ này được tạo ra, chúng minh họa cách chúng ta có thể kiểm soát các thuộc tính bằng các phương thức SETATTR và DELATTR trong Python. Nếu bạn muốn thử các ví dụ được hiển thị, toàn bộ mã có sẵn thông qua liên kết này.

Các cách khác để kiểm soát các thuộc tính trong một đối tượng

Các ví dụ sau đại diện cho các cách khác để kiểm soát các thuộc tính trong Python. Là một điều kiện, tôi không chứng thực chúng là cách tốt nhất để kiểm soát các thuộc tính, thay vào đó là các lựa chọn thay thế có nghĩa là có thể thêm vào kho công cụ của bạn để sử dụng trong Python.

Phần để theo dõi sẽ giới thiệu một hướng dẫn LED ví dụ để sử dụng các nhà trang trí để quản lý các thuộc tính.

Sử dụng trang trí

Ví dụ 2: Sử dụng máy trang trí @staticmethod

Đối với tính liên tục, cùng một lớp nhân viên sẽ được khởi tạo trong các ví dụ về thủ tục tố tụng. Ở đây, bộ trang trí staticmethod có thể được sử dụng để kiểm tra giá trị thuộc tính trong một đối tượng. Cụ thể, ở đây, chúng tôi muốn cả hai giá trị thuộc tính AGE và Service_length là loại int.

Để làm điều này, chúng ta có thể xác định phương thức data_type_check trong lớp của chúng ta và trang trí nó với bộ trang trí staticmethod. Khi các thuộc tính đang được đặt trong hàm tạo init, chúng tôi gọi phương thức data_type_check trên đối tượng của chúng tôi và chuyển theo độ tuổi hoặc dịch vụ_lengm làm đối số. Nếu tuổi và độ dài dịch vụ thuộc loại int, chúng sẽ được trả lại và đặt làm thuộc tính trong đối tượng của chúng tôi. Nếu chúng không thuộc loại Int, ngoại lệ lỗi loại sẽ được nêu ra.

Một điều thực sự tốt đẹp khi sử dụng bộ trang trí Staticmethod, là khả năng tái sử dụng của nó. Ví dụ, nếu chúng tôi đã thêm một đối số tiền thưởng hàng năm vào phương thức INIT của chúng tôi, chúng tôi chỉ có thể gọi cho bộ trang trí StaticMethod một lần nữa và chuyển phần thưởng như một đối số.

Ví dụ 3: Sử dụng một người trang trí tùy chỉnh

Một cách khác để kiểm soát giá trị của các thuộc tính là thông qua một bộ trang trí tùy chỉnh. Để phù hợp với chủ đề của chúng tôi, hãy tạo cùng một lớp, nhưng lần này trang trí phương thức xây dựng init, với một hàm gọi là attr_check.

Khi chúng tôi tạo một thể hiện của lớp nhân viên của chúng tôi, phương thức INIT sẽ được gọi tự động. Khi hàm attr_check trang trí phương pháp init, hàm này sẽ được gọi. attr_check sẽ lấy phương thức init làm đối số và trả lại bên trong. Khi chúng tôi gọi bên trong với đối tượng, tuổi và dịch vụ của chúng tôi, chúng tôi có thể thực hiện kiểm tra loại trên cả độ tuổi và dịch vụ. Nếu tuổi và dịch vụ thuộc loại int, chúng tôi sẽ trả về phương thức init ban đầu với đối tượng, tên, tuổi và dịch vụ và đối số.

Việc triển khai này là một cách tốt đẹp để kiểm soát các giá trị thuộc tính trong Python vì chúng ta có thể chọn những gì đi vào cơ thể bên trong. Trong trường hợp này, chúng tôi đã không thực hiện bất kỳ loại kiểm tra nào trên tên hoặc bất kỳ khoản phụ cấp nào trong độ tuổi, nhưng chúng tôi chỉ có thể thêm các kiểm tra này, bằng cách mở rộng mã được xác định trong hàm bên trong.

Ví dụ 4: Sử dụng các trình trang trí/setter/deleter/setter/deleter

Tuy nhiên, một cách khác để kiểm soát các giá trị thuộc tính trong Python là thông qua việc sử dụng trình trang trí thuộc tính và các phương thức setter và deleter tương ứng của nó.

Hãy tạo lớp nhân viên của chúng tôi một lần nữa. Khi người dùng cố gắng truy cập thuộc tính tên thông qua cú pháp.

Lần này nếu người dùng muốn thay đổi thuộc tính tên, hãy đảm bảo bất kỳ chuỗi nào họ nhập sẽ được viết hoa. Chúng ta có thể đạt được điều này bằng cách xác định một phương thức tên đơn giản cùng với các phương thức setter và deleter tương ứng.

Chúng tôi xác định phương thức tên và trang trí nó với @name.setter. Khi người dùng muốn đặt tên mới, sử dụng cú pháp đối tượng.Attribution, tên mới được đặt trong đối tượng giờ đây sẽ được viết hoa.

Lưu ý, tên cơ bản của thuộc tính tên ‘_name, khác với tên của phương thức để tránh các lỗi đệ quy. Chúng ta không thể có bản thân.name = new_name.title [] trong phần thân của phương thức setter của chúng tôi.

Ví dụ 5: Kiểm tra có điều kiện trong hàm tạo init

Để hoàn thành bài viết này về kiểm soát thuộc tính, cách đơn giản nhất để thực hiện tính toàn vẹn thuộc tính, trên thực tế, có thể bao gồm kiểm tra có điều kiện trong hàm tạo init của chính lớp chúng tôi. Ở đây, chúng tôi cho phép tuổi của nhân viên lớn hơn hoặc bằng 18 và nhỏ hơn hoặc bằng 100. Nếu điều kiện được thỏa mãn, chúng tôi có thể đặt tuổi được cung cấp như một đối số trong phương thức init làm giá trị thuộc tính trong Đối tượng của chúng tôi. Khi một thể hiện được tạo ra không đáp ứng điều kiện này, một ngoại lệ thuộc tính được nêu ra, với một thông báo chuỗi hữu ích thông báo cho người dùng về các điều kiện cần thiết.

Bản tóm tắt

Cảm ơn bạn đã đọc, và tôi hy vọng bạn thích các cách khác nhau để kiểm soát quyền truy cập thuộc tính và giá trị của chúng. Mặc dù tôi chủ yếu tập trung vào việc kiểm tra và phụ cấp phạm vi loại dữ liệu, nhưng bất kỳ điều kiện có thể tưởng tượng nào cũng có thể được áp đặt trên một giá trị thuộc tính. Một địa chỉ email có thể trải qua xác thực bằng Regex trước khi được đặt, để tuân thủ tính toàn vẹn của dữ liệu.

Tôi đã cố tình sử dụng các ví dụ cơ bản ở đây để giúp truyền đạt cách nhiều cách để kiểm soát các giá trị thuộc tính và truy cập hoạt động. Hơn nữa, các mô tả là một cách khác để quản lý các thuộc tính trong Python và tôi hy vọng sẽ viết một phần hướng dẫn về cách sử dụng chúng. Nếu bạn có bất kỳ câu hỏi nào, hoặc muốn có nhiều bài viết theo chủ đề xung quanh chủ đề này, hãy cho tôi biết qua LinkedIn.

Làm thế nào để bạn sửa đổi các thuộc tính trong Python?

Nếu bạn muốn phương thức của mình sửa đổi bất kỳ thuộc tính nào, bạn có thể chuyển tên của nó dưới dạng chuỗi. Bạn có thể sử dụng getAttr [] và setAttr [] để lấy và đặt thuộc tính.pass its name as a string. You can then use getattr[] and setattr[] to get and set the attribute.

Làm thế nào để bạn gán một giá trị cho một thuộc tính trong Python?

Phương thức python setAttr [] được sử dụng để gán thuộc tính đối tượng giá trị của nó. is used to assign the object attribute its value.

Làm thế nào để bạn thay đổi các thuộc tính của một đối tượng?

Để sửa đổi một nhóm đối tượng đã chọn:..
Nhấp chuột phải vào bất kỳ đối tượng đã chọn nào ..
Nhấp vào Thuộc tính ... ....
Nhấp vào tab Thuộc tính.....
Nhấp vào thuộc tính để sửa đổi ..
Nhấp vào Xem/Chỉnh sửa để tải cửa sổ giá trị thuộc tính ..
Trong trường giá trị thực hiện bất kỳ thay đổi cần thiết nào ..
Trong phần Áp dụng vào phần Nhấp vào các đối tượng đã chọn ..
Bấm OK ....

Thuộc tính lớp có thể được thay đổi không?

Nhưng hãy cẩn thận, nếu bạn muốn thay đổi thuộc tính lớp, bạn phải làm điều đó với ký hiệu ClassName.AttributEname.Nếu không, bạn sẽ tạo một biến thể hiện mới.if you want to change a class attribute, you have to do it with the notation ClassName. AttributeName. Otherwise, you will create a new instance variable.

Bài Viết Liên Quan

Chủ Đề