类的装饰器与绑定方法


目录
  • 绑定方法
  • 非绑定方法(静态方法)
  • 如何隐藏属性
  • property装饰器

绑定方法

# 绑定方法分两种 
	1.绑定给对象
    	类中的函数和方法都是默认绑定给对象的 但是类也可以调用
		绑定给对象的方法 对象调用的时候就会把对象本身当做第一个参数传入
 
	2.绑定给类
    	绑定类的方法就是 在函数名或者方法上面添加一个  '@classmethod' 的装饰器  
		这样的话 调用类就会直接把类当做第一个对象传入函数 
        
class Mysql():
    def __init__(self, ip, port):
        self.ip = ip
        self.port = port

    @classmethod  # 该方法绑定给类了,以后有类来调用,会自动把类名当成第一个参数传过来,cls
    def from_conf(cls):
        # cls => Oracle
        # obj = Oracle(settings.IP, settings.PORT)
        obj = cls(settings.IP, settings.PORT)
        return obj

    
a = Mysql.from_conf()

# 可以直接print(a.ip,a.port) 进行取值

非绑定方法(静态方法)

# 非绑定方法也成静态方法 
	就是指既没有被对象绑定 也没有被类绑定 
    '调用的时候不用传入参数 甚至静态函数可以直接不写括号 但是不推荐这种方法 因为不规范'
    
    
# 既不绑定给类,也不绑定给对象
class Student():
    school = 'SH'
    def __init__(self, name, age):
        self.name = name
        self.age = age

    @staticmethod  # 静态方法
    def create_id():
        import uuid
        return uuid.uuid4()

stu = Student('ly', 18)

如何隐藏属性

# 隐藏属性 
	隐藏属性就是在 '定义阶段在要隐藏的属性和方法前面加上_ _就可以进行隐藏了 '
    但是这个隐藏不是真正的隐藏 '直接_ 加 类名加 _ _被隐藏的属性 就可以调用了' 但是不推荐
    
# 其实隐藏属性的底层就是在类定义的阶段 把加了_ _前缀的属性进行了变形 来达到隐藏的目的

'隐藏属性是对外隐藏 对内开放'

# 为什么要隐藏 隐藏可以防止外部直接进行修改删除 或者对用户的修改进行严格的控制 用户只能通过你开放的接口来访问隐藏的属性 
    

 # 1. 如何隐藏
		# 1. 如何隐藏
'''
    1. 在类定义阶段,发生了语法上的变形_类名__属性名
    2. 隐藏对外不对内
    3. 只有在类定义阶段发生变形,其他情况都不发生变形了

为什么要隐藏: 类里面的隐藏属性, 类外部可以使用,但是目的不是让类外部使用的,类外部要是想用,在类内部开放接口进行访问
            可以达到对外部数据的严格控制
'''

	
    
class Student():
    __school = 'SH' # _Student__school  => _类名__属性名
    def __init__(self, name, age):
        self.__name = name
        self.age = age

    def __tell_info(self):  # _Student__tell_info  => _类名__函数名
        print('name: %s, age: %s' % (self.__name, self.age))

    def get_school(self):
        return self.__school  # self._Student__school

    def set_school(self, v):
        if type(v) is not str:
            print('数据类型不合法')
        # if isinstance(v, str):
            return
        self.__school = v
           
  

property装饰器

class Student():
    __school = 'SH'  # _Student__school  => _类名__属性名

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

    def __tell_info(self):  # _Student__tell_info  => _类名__函数名
        print('name: %s, age: %s' % (self.__name, self.age))

    @property  # 把方法伪装成属性
    def name(self):
        return "name:%s" % self.__name

    @name.setter
    def name(self, v):
        if type(v) is not str:
            print('数据类型不合法')
        # if isinstance(v, str):
            return
        self.__name = v

    @name.deleter
    def name(self):
        print('不让删')

stu = Student('ly', 18)
print(stu.get_name())

stu.name = 123
print(stu.name)

del stu.name

相关