绑定方法和隐藏属性之property装饰器

一:绑定方法

1.绑定给对象的方法
class Person:
    # 绑定给对象的方法 对象调用 自动把对象传入
    def print_name(self):
        print(self.name)
        print('对象的绑定方法')
        
   p = Person()
   p.name = 'lqz'
    
   # 对象来调用对象的绑定方法 自动将对象传入
   p.print_name()  输出结果:lqz  对象的绑定方法

image

2.绑定给类的方法
@classmethod是一个装饰器 绑定给类的方法 类来调用 自动把类传入

@classmethod
def test(cls):
	print(cls)  输出结果  <class '__main__.Person'>
	print(cls.__name__)  类名的字符串现实  Person
	print('类的绑定方法')
	
@classmethod
def create_obj(cls):	
	return cls()

类来调用类的绑定方法
Person.tese()


如果通过类,调用类的绑定方法,获得对象
直接通过类做一件事,就用类的绑定方法
p = Person()
p = Person.create_obj()

image

3.非绑定方法之静态方法
@staticmethod 静态方法 非绑定方法 它不绑定给任何人 它就是一个普通的函数 类和对象都可以来调 但不把类和对象自动传进来

=
class Student():
    school = 'SH'
    def __init__(self, name, age):
        self.name = name
        self.age = age

    @staticmethod   静态方法
    def create_id():  这里就不需要传self参数
        import uuid  uuid模块就是随机生成一个随机数的
        return uuid.uuid4()
    
 stu = Student('ly', 18)
    
静态方法,不绑定给任何人,谁都可以来调,就是个普通函数,有几个值就传几个值

print(stu.create_id())  这是可以生成一个随机数
print(Student.create_id())  用类调用同样可以执行生成一个随机数

image

二,隐藏属性
1.如何隐藏属性
如何隐藏属性?
1.在类定义阶段,发生了语法上的变形_类名_属性名
2.隐藏对外隐藏 不对内隐藏
3.只有在定义阶段发生变形,其他情况都不发生变形
为什么要隐藏?
1.类里面隐藏属性,类外部可以使用 但是目的不是为了让外部使用的,类外部要2.是想用,在类内部开放接口进行访问
    		可以达到对外部数据的严格控制
隐藏属性实列:

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:   # 限制改隐藏属性必须要字符串   if isinstance(v, str): 一样
            print('数据类型不合法')
            return 
        self.__school = v
stu = Student('ly', 18)

print(stu.schoole)  # 属性隐藏 取值 会报错
print(stu.__school)  # 报错

查看属性名称空间
print(Student.__dict__)

取值隐藏属性
print(stu._Student__school)  # 取隐藏属性 结果:SH

方法内 取 隐藏属性
print(stu.get_school())  # 输出结果:SH

只有在类定义阶段发生变形,其他情况都不发生变形了
stu.__x = 'x'
print(stu.__x)  # 输出结果:x

将name隐藏了 取值报错
print(stu.name)  # 报错

查看对象名称空间
print(stu.__dict__)  # 输出结果:{'_Student__name': 'ly', 'age': 18}

调用修改隐藏属性方法
stu.set_school('ly')
print(stu.get_school())

image

三,property 装饰器
property装饰器基本使用
分为:
1.@property  取值
2.@name.setter  修改
3.@name.deleter  不能删除

name 是根据自己定制统一要求
修改属性必须配合使用
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

     只要加了property装饰器 就可以共同命名   修改属性名
    @name.setter
    def name(self, v):
        if type(v) is not str:   判断是否为字符串
            print('数据类型不合法')
            return
        self.__name = v
    不让删除
    @name.deleter
    def name(self):
        print('不让删')
拿到name
stu = Student('ly', 18)

不使用property装饰器前,调用方法
print(stu.name())   输出结果: ly

property装饰器可以让调用方法不使用括号()
print(stu.name)   输出结果: name:ly

修改属性
加了property装饰器 和name.setter装饰器 才能修改
stu.name = 'x'
print(stu.name)   输出结果: x


删除属性
del stu.name   结果:不让删

image

posted @ 2021-12-06 22:17  AlexEvans  阅读(37)  评论(0编辑  收藏  举报