Apakah kaedah mengikat dan tidak mengikat kelas dan objek dalam Python

王林
Lepaskan: 2023-05-19 18:39:38
ke hadapan
1416 orang telah melayarinya

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__)
Salin selepas log masuk
{'name': 'Kitty', 'age': 18}

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

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
Salin selepas log masuk

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()
Salin selepas log masuk

output


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
Salin selepas log masuk

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
Salin selepas log masuk
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
Salin selepas log masuk
# settings.py
IP = &#39;1.1.1.10&#39;
PORT = 3306
NET = 27
Salin selepas log masuk
# 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)
Salin selepas log masuk

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
Salin selepas log masuk

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;>>
Salin selepas log masuk

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!

Label berkaitan:
sumber:yisu.com
Kenyataan Laman Web ini
Kandungan artikel ini disumbangkan secara sukarela oleh netizen, dan hak cipta adalah milik pengarang asal. Laman web ini tidak memikul tanggungjawab undang-undang yang sepadan. Jika anda menemui sebarang kandungan yang disyaki plagiarisme atau pelanggaran, sila hubungi admin@php.cn
Tutorial Popular
Lagi>
Muat turun terkini
Lagi>
kesan web
Kod sumber laman web
Bahan laman web
Templat hujung hadapan