类的装饰器与绑定方法
目录
- 绑定方法
- 非绑定方法(静态方法)
- 如何隐藏属性
- 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