面向对象编程之绑定方法、掩藏属性、装饰器

发布时间 2023-06-26 15:40:38作者: 凡人半睁眼

一、绑定方法

1、绑定给类的方法@classmethod

class Oracle():
    def __init__(self, ip, port):
        self.ip = ip
        self.port = port

    @classmethod  # 该方法已经变成了绑定给类的方法,而不是绑定给对象了
    def from_func(cls):
        print("from func")
        return cls('127.0.0.1', '3306')

obj = Oracle('127.0.0.1', 3306)
res = obj.from_func()
print(res)
## 结果
# from func
# <__main__.Oracle object at 0x7f7c78025668>

res = Oracle.from_func()  # from func  绑定给类的方法就有类来调用,特殊之处就是:会把类名当成第一个参数传给方法的第一个形参
print(res)

注:

from_func方法使用了@classmethod装饰器,将其转变为类方法。类方法绑定给类而不是对象,意味着你可以直接通过类来调用该方法,而不需要先创建对象。

可以通过Oracle.from_func()来调用from_func方法,而不需要创建Oracle的实例。这将输出"from func"并返回一个新创建的Oracle对象。

即使将方法转换为类方法,仍然可以通过对象来调用该方法,但此时对象将被忽略,类方法将使用类本身作为参数。因此,在你的代码中,obj.from_func()仍然可以正常执行,但是它将返回一个新的Oracle对象,而不是将其赋值给res

综上所述,即使方法绑定给类,对象仍然可以调用该方法,但是类方法将忽略对象本身并使用类作为参数进行操作。

2、绑定给对象的方法(self 关键字进行的绑定)

class Student():
    school = 'sh'

    def __init__(self, name, age, gender):
        self.name = name
        self.age = age
        self.gender = gender

    def tell_info(self):
        print('name:%s age:%s gender:%s' % (self.name, self.age, self.gender))

stu = Student('kevin', 18, 'male')
# Student.tell_info(stu)
print(stu.tell_info())

二、非绑定方法

不绑定给类使用,也不绑定给对象使用

@staticmethod # 该方法已经谁都不绑定,谁都能来调用,类和对象都可以直接来调用,其实就是个普通方法

class Student:
    def __init__(self, name, age, gender):
        self.name = name
        self.age = age
        self.gender = gender
        self.id = self.get_code(5)
        self.shengfenid = self.create_id()

    @staticmethod  # 该方法已经谁都不绑定,谁都能来调用,类和对象都可以直接来调用,其实就是个普通方法
    def create_id():
        import uuid
        return uuid.uuid4()

    """什么时候使用静态方法:一般就是方法里面既不用对象,也不用类的时候就使用静态方法"""
    @staticmethod
    def get_code(n):
        code = ''
        import random
        for i in range(n):
            random_int = str(random.randint(0, 9))
            random_upper = chr(random.randint(65, 90))
            random_lower = chr(random.randint(97, 122))
            temp = random.choice([random_int, random_upper, random_lower])
            code += temp
        return code

# 实例化一个对象,调用id和shengfenid
stu = Student('kevin', 19, 'female')
print(stu.id)
print(stu.shengfenid)

# 类在外部调用方法
print(Student.create_id())
print(Student.get_code(5))