>  기사  >  백엔드 개발  >  Python에서 클래스와 객체의 바인딩 및 바인딩 해제 방법은 무엇입니까?

Python에서 클래스와 객체의 바인딩 및 바인딩 해제 방법은 무엇입니까?

王林
王林앞으로
2023-05-19 18:39:381410검색

클래스에 정의된 메서드는 크게 바인딩된 메서드와 바인딩되지 않은 메서드의 두 가지 범주로 나눌 수 있습니다. 바인딩 방법은 객체에 바인딩된 메서드와 클래스에 바인딩된 메서드로 나눌 수 있습니다.

1. 바인딩 방법

1 개체의 바인딩 방법

클래스의 어떤 데코레이터에서도 수정되지 않는 메서드는 개체에 바인딩된 메서드입니다.

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라고 부르지만, 다른 이름으로도 작성 가능) 클래스 호출을 사용하는 경우 첫 번째 매개변수를 수동으로 전달해야 합니다.

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 바인딩 방법 요약

함수 본문 코드가 외부에서 전달된 클래스를 사용해야 하는 경우 함수는 클래스에 바인딩된 메서드로 정의되어야 합니다.

함수 본문 코드가 외부에서 전달된 객체를 사용해야 하는 경우, then 함수는 객체에 바인딩된 메서드로 정의되어야 합니다

# 一种新的实例化方式:从配置文件中读取配置完成实例化
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 중국어 웹사이트의 기타 관련 기사를 참조하세요!

성명:
이 기사는 yisu.com에서 복제됩니다. 침해가 있는 경우 admin@php.cn으로 문의하시기 바랍니다. 삭제