클래스에 정의된 메서드는 크게 바인딩된 메서드와 바인딩되지 않은 메서드의 두 가지 범주로 나눌 수 있습니다. 바인딩 방법은 객체에 바인딩된 메서드와 클래스에 바인딩된 메서드로 나눌 수 있습니다.
클래스의 어떤 데코레이터에서도 수정되지 않는 메서드는 개체에 바인딩된 메서드입니다.
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('Kitty', 18) p.speak() # 通过对象调用 #输出 Kitty, 18 Person.speak(p) # 通过类调用 #输出 Kitty, 18
@classmethod로 수정된 메서드는 클래스 메서드, 즉 인스턴스가 아닌 클래스에 바인딩되는 메서드입니다. 이 유형의 메소드는 클래스에 맞게 특별히 사용자 정의됩니다. 클래스에 바인딩된 메서드를 호출하면 클래스 자체가 메서드의 첫 번째 인수로 전달됩니다.
class Operate_database(): host = '192.168.0.5' port = '3306' user = 'abc' password = '123456' @classmethod def connect(cls): # 约定俗成第一个参数名为cls,也可以定义为其他参数名 print(cls) print(cls.host + ':' + cls.port + ' ' + cls.user + '/' + cls.password) Operate_database.connect()
Output
192.168.0.5:3306 abc/123456
객체를 통해 호출할 수도 있지만 기본적으로 전달되는 첫 번째 매개변수는 여전히 해당 클래스입니다. 이 개체에.
Operate_database().connect() # 输出结果一致 #输出 <class '__main__.Operate_database'> 192.168.0.5:3306 abc/123456
클래스 내부에서 @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('utf-8')) # 加盐处理 m.update(password.encode('utf-8')) return m.hexdigest() hash_password = Operate_database.get_passwrod('lala', '123456') # 通过类来调用 print(hash_password) #输出 f7a1cc409ed6f51058c2b4a94a7e1956
p = Operate_database('192.168.0.5', '3306', 'abc', '123456') hash_password = p.get_passwrod(p.user, p.password) # 也可以通过对象调用 print(hash_password) #输出 0659c7992e268962384eb17fafe88364
간단히 말해서 언바운드 메서드는 클래스 내부에 배치된 일반적인 메서드입니다.
이제 MySQL에 의해 인스턴스화된 개체가 settings.py 파일에서 데이터를 읽을 수 있어야 한다는 요구 사항이 있다고 가정합니다.
# settings.py IP = '1.1.1.10' 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('%s:%s' % (self.ip, self.port)) @classmethod def from_conf(cls): return cls(IP, NET, PORT) @staticmethod def func(x, y): print('不与任何人绑定') @staticmethod def create_uid(): """随机生成一个字符串""" return uuid.uuid1() #学习中遇到问题没人解答?小编创建了一个Python学习交流:711312441 # 默认的实例化方式:类名() obj = Mysql('10.10.0.9', 3307, 27)
obj.tell_info() 10.10.0.9:3307
함수 본문 코드가 외부에서 전달된 클래스를 사용해야 하는 경우 함수는 클래스에 바인딩된 메서드로 정의되어야 합니다.
함수 본문 코드가 외부에서 전달된 객체를 사용해야 하는 경우, 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 '__main__.Mysql'>>
함수 본문 코드에 외부에서 전달된 클래스나 외부에서 전달된 객체가 필요하지 않은 경우 함수는 다음으로 정의되어야 합니다. 바인딩되지 않은 메서드/일반 함수
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 중국어 웹사이트의 기타 관련 기사를 참조하세요!