类和对象的绑定方法和非绑定方法
类中定义的方法大致可以分为两类:绑定方法和非绑定方法。其中绑定方法又可以分为绑定到对象的方法和绑定到类的方法。
绑定方法,主要的特殊之处,绑定给谁就是谁来调用,并且会把自身(对象self)传过来
类的绑定方法:绑定给类的,类来调用,会把类自身传递过来
一、绑定方法
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('laowang', 18)
print(p.__dict__)
{'name': 'laowang', 'age': 18}
print(Person.__dict__['speak'])
<function Person.speak at 0x10f0dd268>
speak即为绑定到对象的方法,这个方法不在对象的名称空间中,而是在类的名称空间中。
通过对象调用绑定到对象的方法,会有一个自动传值的过程,即自动将当前对象传递给方法的第一个参数(self,一般都叫self,也可以写成别的名称);若是使用类调用,则第一个参数需要手动传值。
p = Person('laowang', 18)
p.speak() # 通过对象调用
Person.speak(p) # 通过类调用
1.2 类的绑定方法
类中使用 @classmethod 修饰的方法就是绑定到类的方法。这类方法专门为类定制。通过类名调用绑定到类的方法时,会将类本身当做参数传给类方法的第一个参数。
类的绑定方法用在什么地方?
不需要通过对象进行调用,只需要通过类就能获取到一些东西的时候,使用类的绑定方法
类的绑定方法也可以由对象来调用(一般使用很少)
class Person:
def __init__(self, name, age):
print(self)
self.name = name
self.age = age
@classmethod
def test(cls):
print(cls)
print("类的绑定方法")
# 类实例化产生对象,返回
return cls('laowang', 19)
@classmethod
def get_obj_by_name(cls, name):
# 1. 去文件中查找名字name中pickle文件
# 2.反序列化成对象
# 3 return 返回对象
pass
p = Person.test()
print(p.name)
# 使用对象调用
# 通过对象也可以调用,只是默认传递的第一个参数还是这个对象对应的类。
p1 = Person("laowang2", 30)
p1.test()
print(p1.name)
print("*" * 30)
# 类名
print(Person.__name__)
print(Person.__dict__)
print(Person.__class__)
-
总结:
-
@clssmethod是一个装饰器,放在类中函数的上面,该函数就变成了类的绑定方法
- 类的绑定方法有类来调用,自动把类传过去,对象也可以调用,一般不用
- 类的绑定方法用在什么地方?, 不需要通过对象,只需要通过类就能完成某些事的时候,就把该方法定义为类的绑定方法
-
二、非绑定方法(静态方法)
staticmethod:非绑定方法,定义在类内部,就是一个普通的方法,谁都不绑定
对象/类都可以调用,但是不会自动传值,他就是一个普通的函数,想把函数拿到类中管理,就可以定义静态方法
在类内部使用 @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
self.id = self.get_uuid()
@staticmethod
def get_passwrod(salt, password):
m = hashlib.md5(salt.encode('utf-8')) # 加盐处理
m.update(password.encode('utf-8'))
return m.hexdigest()
@staticmethod
def get_uuid():
return uuid.uuid4()
hash_password = Operate_database.get_passwrod('lala', '123456') # 通过类来调用
print(hash_password)
print(p.id)
f7a1cc409ed6f51058c2b4a94a7e1956
p = Operate_database('192.168.0.5', '3306', 'abc', '123456')
hash_password = p.get_passwrod(p.user, p.password) # 也可以通过对象调用
print(hash_password)
0659c7992e268962384eb17fafe88364
简而言之,非绑定方法就是将普通方法放到了类的内部。
如果函数体代码既不需要外部传入的类也不需要外部传入的对象,则应该将该函数定义成非绑定方法/普通函数
三、总结
绑定方法:
-
@clssmethod是一个装饰器,放在类中函数的上面,该函数就变成了类的绑定方法
-
类的绑定方法有类来调用,自动把类传过去,对象也可以调用,一般不用
-
类的绑定方法用在什么地方?, 不需要通过对象,只需要通过类就能完成某些事的时候,就把该方法定义为类的绑定方法
非绑定方法:
- @staticmethod是一个装饰器,放在类中函数的上面,该函数就变成了类的绑定方法
- 非绑定方法就是将普通方法放到了类的内部。