Heim  >  Artikel  >  Backend-Entwicklung  >  Was sind die Bindungs- und Entbindungsmethoden von Klassen und Objekten in Python?

Was sind die Bindungs- und Entbindungsmethoden von Klassen und Objekten in Python?

王林
王林nach vorne
2023-05-19 18:39:381410Durchsuche

Die in der Klasse definierten Methoden können grob in zwei Kategorien unterteilt werden: gebundene Methoden und nicht gebundene Methoden. Bindungsmethoden können in an Objekte gebundene Methoden und an an Klassen gebundene Methoden unterteilt werden.

1. Bindungsmethode

1 Objektbindungsmethode

Die Methode in der Klasse, die von keinem Dekorateur geändert wird, ist an Objektmethoden gebunden. Diese Methoden werden speziell für das Objekt angepasst.

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 ist eine an ein Objekt gebundene Methode. Diese Methode befindet sich nicht im Namensraum des Objekts, sondern im Namensraum der Klasse.

Wenn Sie eine an ein Objekt gebundene Methode über ein Objekt aufrufen, findet ein automatischer Wertübertragungsprozess statt, dh das aktuelle Objekt wird automatisch an den ersten Parameter der Methode übergeben (selbst, normalerweise aufgerufen). self oder als anderer Name geschrieben); wenn es über eine Klasse aufgerufen wird, muss der erste Parameter manuell übergeben werden.

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

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

2 Klassenbindungsmethode

Die durch @classmethod geänderte Methode gehört zur Klassenmethode, das heißt, die Methode ist an die Klasse und nicht an die Instanz gebunden. Diese Art von Methode wird speziell für die Klasse angepasst. Wenn Sie eine an eine Klasse gebundene Methode aufrufen, wird die Klasse selbst als erstes Argument an die Methode übergeben.

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

4133de66e39980eb57623002c4a0aef5
192.168.0.5:3306 abc/123456

# 🎜 🎜#
Es kann auch über ein Objekt aufgerufen werden, aber der erste standardmäßig übergebene Parameter ist immer noch die Klasse, die diesem Objekt entspricht.

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

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

2. Unverbindliche Methoden

Mit @staticmethod innerhalb einer Klasse geänderte Methoden sind unverbindliche Methoden. Dieser Methodentyp unterscheidet sich nicht von einer gewöhnlichen definierten Funktion. Es ist nicht an eine Klasse oder ein Objekt gebunden, jeder kann es aufrufen und es gibt keinen automatischen Wertübertragungseffekt.

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
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

Kurz gesagt besteht die ungebundene Methode darin, die gewöhnliche Methode in die Klasse einzufügen.

3. Übung

Angenommen, wir haben jetzt die Anforderung, dass die von MySQL instanziierten Objekte Daten aus der Datei „settings.py“ lesen müssen.

# 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)
obj.tell_info()

10.10.0.9:3307

1 Zusammenfassung der Bindungsmethoden

Wenn der Funktionskörpercode eine externe Klasse verwenden muss, sollte die Funktion als an die Klasse gebundene Methode definiert werden#🎜🎜 #

Wenn der Funktionskörpercode ein externes Objekt verwenden muss, sollte die Funktion als an das Objekt gebundene Methode definiert werden

# 一种新的实例化方式:从配置文件中读取配置完成实例化
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;>>

2 Zusammenfassung der unverbindlichen Methoden

# 🎜 🎜#Wenn der Funktionskörpercode weder eine externe Klasse noch ein externes Objekt erfordert, sollte die Funktion als nicht gebundene Methode/gewöhnliche Funktion definiert werden

obj.func(1, 2)
#输出
不与任何人绑定


Mysql.func(3, 4)
#输出
不与任何人绑定


print(obj.func)
#输出
<function Mysql.func at 0x10f10e620>


print(Mysql.func)
#输出
<function Mysql.func at 0x10f10e620>


print(obj.uid)
#输出
a78489ec-92a3-11e9-b4d7-acde48001122

Das obige ist der detaillierte Inhalt vonWas sind die Bindungs- und Entbindungsmethoden von Klassen und Objekten in Python?. Für weitere Informationen folgen Sie bitte anderen verwandten Artikeln auf der PHP chinesischen Website!

Stellungnahme:
Dieser Artikel ist reproduziert unter:yisu.com. Bei Verstößen wenden Sie sich bitte an admin@php.cn löschen