类和对象的绑定方法和非绑定方法

类和对象的绑定方法和非绑定方法

类中定义的方法大致可以分为两类:绑定方法和非绑定方法。其中绑定方法又可以分为绑定到对象的方法和绑定到类的方法。

绑定方法,主要的特殊之处,绑定给谁就是谁来调用,并且会把自身(对象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__)
  • 总结:
    1.@clssmethod是一个装饰器,放在类中函数的上面,该函数就变成了类的绑定方法
    2. 类的绑定方法有类来调用,自动把类传过去,对象也可以调用,一般不用
    3. 类的绑定方法用在什么地方?
    * 不需要通过对象,只需要通过类就能完成某些事的时候,就把该方法定义为类的绑定方法

二、非绑定方法(静态方法)

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

    @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

简而言之,非绑定方法就是将普通方法放到了类的内部。

如果函数体代码既不需要外部传入的类也不需要外部传入的对象,则应该将该函数定义成非绑定方法/普通函数

转载于:https://www.cnblogs.com/randysun/p/11430044.html

  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值