ホームページ >バックエンド開発 >Python チュートリアル >Python のクラスとオブジェクトのバインドおよびバインド解除メソッドとは何ですか

Python のクラスとオブジェクトのバインドおよびバインド解除メソッドとは何ですか

王林
王林転載
2023-05-19 18:39:381452ブラウズ

クラス内で定義されるメソッドは、バインドされたメソッドと非バインドされたメソッドの 2 つのカテゴリに大別できます。バインド メソッドは、オブジェクトにバインドされるメソッドとクラスにバインドされるメソッドに分類できます。

1. バインディング メソッド

1 オブジェクトのバインディング メソッド

クラス内のデコレータによって変更されていないメソッドが、オブジェクトにバインドされるメソッドです。 type メソッドはオブジェクト専用にカスタマイズされます。

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 はオブジェクトにバインドされたメソッドです。このメソッドはオブジェクトの名前空間ではなく、クラスの名前空間にあります。

オブジェクトを介してオブジェクトにバインドされたメソッドを呼び出す場合、自動値転送プロセスが行われます。つまり、現在のオブジェクトがメソッドの最初のパラメータ (self、通常は self と呼ばれます) に自動的に渡されます。 name); クラスを使用して呼び出される場合は、最初のパラメータを手動で渡す必要があります。

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

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

2 クラス バインド メソッド

@classmethod によって変更されたメソッドは、クラス メソッド、つまりインスタンスではなくクラスにバインドされたメソッドに属します。このタイプのメソッドは、クラス専用にカスタマイズされます。クラスにバインドされたメソッドを呼び出すと、クラス自体が最初の引数としてメソッドに渡されます。

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

オブジェクトを渡しますこれを呼び出すこともできますが、デフォルトで渡される最初のパラメータは依然としてこのオブジェクトに対応するクラスです。

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

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

2. 非バインディングメソッド

クラス内で @staticmethod で変更されたメソッドは非バインディングメソッドであり、通常の定義関数と何ら変わりはなく、クラスと何ら変わりません。または、オブジェクト バインディングは誰でも呼び出すことができ、自動値転送効果はありません。

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

アンバインドメソッドとは、一言で言えば、通常のメソッドをクラス内に置くというものです。

3. 演習

Mysql によってインスタンス化されたオブジェクトが settings.py ファイルからデータを読み取ることができるという要件があるとします。

# 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 バインド メソッドの概要

関数本体のコードで外部クラスを使用する必要がある場合、関数はクラスにバインドされたメソッドとして定義する必要があります

If If関数本体コードは外部オブジェクトを使用する必要があるため、関数はオブジェクトにバインドされたメソッドとして定義する必要があります

# 一种新的实例化方式:从配置文件中读取配置完成实例化
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 非バインド メソッドの概要

関数本体コードが外部オブジェクトを使用しない場合外部から渡されたクラスが外部から渡されたオブジェクトを必要としない場合、関数は非バインド メソッド/通常の関数として定義する必要があります

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

以上がPython のクラスとオブジェクトのバインドおよびバインド解除メソッドとは何ですかの詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。

声明:
この記事はyisu.comで複製されています。侵害がある場合は、admin@php.cn までご連絡ください。