Rumah  >  Artikel  >  pembangunan bahagian belakang  >  Apakah kaedah mengikat dan tidak mengikat kelas dan objek dalam Python

Apakah kaedah mengikat dan tidak mengikat kelas dan objek dalam Python

王林
王林ke hadapan
2023-05-19 18:39:381368semak imbas

Kaedah yang ditakrifkan dalam kelas boleh dibahagikan secara kasar kepada dua kategori: kaedah terikat dan kaedah tidak terikat. Kaedah mengikat boleh dibahagikan kepada kaedah terikat kepada objek dan kaedah terikat kepada kelas.

1. Kaedah mengikat

1 Kaedah mengikat objek

Kaedah yang tidak diubah suai oleh mana-mana penghias dalam kelas ialah kaedah terikat pada objek ini disesuaikan khusus untuk objek.

class Person:
    country = "China"

    def __init__(self, name, age):
        self.name = name
        self.age = age

    def speak(self):
        print(self.name + ', ' + str(self.age))


p = Person('Kitty', 18)
print(p.__dict__)
{'name': 'Kitty', 'age': 18}

print(Person.__dict__['speak'])
<function Person.speak at 0x10f0dd268>

speak ialah kaedah yang terikat pada objek Kaedah ini bukan dalam ruang nama objek, tetapi dalam ruang nama kelas.

Apabila memanggil kaedah yang terikat pada objek melalui objek, akan ada proses pemindahan nilai automatik, iaitu objek semasa secara automatik dihantar ke parameter pertama kaedah (diri, biasanya dipanggil diri, atau ia juga boleh ditulis sebagai nama lain); jika ia dipanggil menggunakan kelas, parameter pertama perlu dihantar secara manual.

p = Person(&#39;Kitty&#39;, 18)
p.speak()  # 通过对象调用
#输出
Kitty, 18

Person.speak(p)  # 通过类调用
#输出
Kitty, 18

2 Kaedah mengikat kelas

Kaedah yang diubah suai oleh @classmethod ialah kaedah kelas, iaitu kaedah yang terikat kepada kelas dan bukannya kejadian. Kaedah jenis ini disesuaikan khusus untuk kelas. Apabila anda memanggil kaedah terikat kepada kelas, kelas itu sendiri diluluskan sebagai hujah pertama kepada kaedah tersebut.

class Operate_database():
    host = &#39;192.168.0.5&#39;
    port = &#39;3306&#39;
    user = &#39;abc&#39;
    password = &#39;123456&#39;

    @classmethod
    def connect(cls):  # 约定俗成第一个参数名为cls,也可以定义为其他参数名
        print(cls)
        print(cls.host + &#39;:&#39; + cls.port + &#39; &#39; + cls.user + &#39;/&#39; + cls.password)


Operate_database.connect()

output

ba3aaa4a350dee5f67fe7e3481745a82
192.168.0.5:3306 abc/123456

pass>

objek Ia boleh dipanggil, tetapi parameter pertama yang diluluskan secara lalai masih merupakan kelas yang sepadan dengan objek ini.

Operate_database().connect()  # 输出结果一致

#输出
<class &#39;__main__.Operate_database&#39;>
192.168.0.5:3306 abc/123456

2. Kaedah tidak terikat

Kaedah yang diubah suai dengan @staticmethod di dalam kelas ialah kaedah tidak terikat Kaedah ini tidak berbeza daripada fungsi yang ditetapkan biasa dan tidak berbeza daripada kelas atau Objek mengikat boleh dipanggil oleh sesiapa sahaja, dan tiada kesan pemindahan nilai automatik.

import hashlib


class Operate_database():
    def __init__(self, host, port, user, password):
        self.host = host
        self.port = port
        self.user = user
        self.password = password

    @staticmethod
    def get_passwrod(salt, password):
        m = hashlib.md5(salt.encode(&#39;utf-8&#39;))  # 加盐处理
        m.update(password.encode(&#39;utf-8&#39;))
        return m.hexdigest()


hash_password = Operate_database.get_passwrod(&#39;lala&#39;, &#39;123456&#39;)  # 通过类来调用
print(hash_password)

#输出
f7a1cc409ed6f51058c2b4a94a7e1956
rrree

Ringkasnya, kaedah tidak terikat ialah kaedah biasa yang diletakkan di dalam kelas.

3. Latihan

Andaikan kita kini mempunyai keperluan bahawa objek yang dibuat instantiated oleh Mysql boleh membaca data daripada tetapan fail.py.

p = Operate_database(&#39;192.168.0.5&#39;, &#39;3306&#39;, &#39;abc&#39;, &#39;123456&#39;)
hash_password = p.get_passwrod(p.user, p.password)  # 也可以通过对象调用
print(hash_password)
#输出
0659c7992e268962384eb17fafe88364
# settings.py
IP = &#39;1.1.1.10&#39;
PORT = 3306
NET = 27
# test.py
import uuid


class Mysql:
    def __init__(self, ip, port, net):
        self.uid = self.create_uid()
        self.ip = ip
        self.port = port
        self.net = net

    def tell_info(self):
        """查看ip地址和端口号"""
        print(&#39;%s:%s&#39; % (self.ip, self.port))

    @classmethod
    def from_conf(cls):
        return cls(IP, NET, PORT)

    @staticmethod
    def func(x, y):
        print(&#39;不与任何人绑定&#39;)

    @staticmethod
    def create_uid():
        """随机生成一个字符串"""
        return uuid.uuid1()

#学习中遇到问题没人解答?小编创建了一个Python学习交流:711312441
# 默认的实例化方式:类名()
obj = Mysql(&#39;10.10.0.9&#39;, 3307, 27)

1 Ringkasan kaedah pengikatan

Jika kod badan fungsi perlu menggunakan kelas luaran, fungsi itu hendaklah ditakrifkan sebagai kaedah terikat kepada kelas

Jika Jika Jika kod badan fungsi perlu menggunakan objek luaran, fungsi harus ditakrifkan sebagai kaedah terikat pada objek

obj.tell_info()

10.10.0.9:3307

2 Ringkasan kaedah tidak terikat

Jika kod badan fungsi tidak memerlukan sama ada Jika kelas yang diluluskan dari luar tidak memerlukan objek yang dihantar dari luar, fungsi itu hendaklah ditakrifkan sebagai kaedah tidak terikat/fungsi biasa

# 一种新的实例化方式:从配置文件中读取配置完成实例化
obj1 = Mysql.from_conf()
obj1.tell_info()

#输出
1.1.1.10:27



print(obj.tell_info)
#输出
<bound method Mysql.tell_info of <__main__.Mysql object at 0x10f469240>>



print(obj.from_conf)
#输出
<bound method Mysql.from_conf of <class &#39;__main__.Mysql&#39;>>

Atas ialah kandungan terperinci Apakah kaedah mengikat dan tidak mengikat kelas dan objek dalam Python. Untuk maklumat lanjut, sila ikut artikel berkaitan lain di laman web China PHP!

Kenyataan:
Artikel ini dikembalikan pada:yisu.com. Jika ada pelanggaran, sila hubungi admin@php.cn Padam