类的绑定方法及隐藏属性

绑定方法

1.绑定给对象的

​ 类中定义的函数(没有被任何装饰器装饰的),其实主要是给对象使用的,而且是绑定到对象的,虽然所有对象指向的都是相同的功能,但是绑定到不同的对象就是不同的绑定方法

​ 强调:绑定到对象的方法的特殊之处在于,绑定给谁就由谁来调用,谁来调用,就会将‘谁’本身当做第一个参数传给方法,即自动传值(方法__init__也是一样的道理)


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

    # 绑定给对象的方法,对象来调用,会把自己当成第一个参数传到函数里面self
    def tell_info(self):
        print('name: %s,age:%s, gender:%s' % (self.name, self.age, self.gender))

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

2.绑定给类的

	
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
 Mysql.from_conf()
 

非绑定方法

​ 在类内部用staticmethod装饰的函数即非绑定方法,就是普通函数

​ statimethod不与类或对象绑定,谁都可以调用,没有自动传值效果

# 既不绑定给类,也不绑定给对象
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)

# print(stu.create_id())
# print(Student.create_id())
print(stu.create_id())

如何隐藏属性

在python中用双下划线开头的方式将属性隐藏起来(设置成私有的)

* 其实这仅仅这是一种变形操作且仅仅只在类定义阶段发生变形

* 类中所有双下划线开头的名称如__x都会在类定义时自动变形成:_类名__x的形式	

* 只有在类定义阶段发生变形,其他情况都不发生变形了

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

什么是特性property

property是一种特殊的属性,访问它时会执行一段功能(函数)然后返回值

为什么要用property

​ 将一个类的函数定义成特性以后,对象再去使用的时候obj.name,根本无法察觉自己的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

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

stu.name = 123
print(stu.name)

del stu.name


posted @ 2021-12-03 20:37  skuukzky  阅读(64)  评论(0)    收藏  举报