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

王林
リリース: 2023-05-19 18:39:38
転載
1415 人が閲覧しました

クラス内で定義されるメソッドは、バインドされたメソッドと非バインドされたメソッドの 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


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 までご連絡ください。
最新の問題
人気のチュートリアル
詳細>
最新のダウンロード
詳細>
ウェブエフェクト
公式サイト
サイト素材
フロントエンドテンプレート