python双下划线含义、MethodType把函数变为方法以及类继承

来源:互联网 发布:vb for循环嵌套if 编辑:程序博客网 时间:2024/05/17 05:14
不多说,直接给出学习代码记录
# python对属性 权限的控制是通过属性名来实现的# 如果一个属性由双下划线开头(__),则该属性就无法被外部访问# 例1. 双下划线开头的属性不能直接被外部访问class Person(object):  # 继承object类得到新式类    def __init__(self, name):        self.name = name        self._sex = 'M'        self.__age = 20p = Person('Alice')print(p.name)print(p._sex)# print(p.__age)  # 这个地方会报错,告诉你该属性不存在print(p.__dict__)  # 可以看到其他属性都没变,但__age变成了_Person__ageprint(p._Person__age)  # 这样就可以访问到__age属性了# 如果一份属性以"__xx__"的形式定义,那么它又可以被外部访问了# 因为以"__xx__"定义的属性在python中称为特殊属性,有很多预定义的特殊属性可以使用#以单下划线开头的属性虽然也可以被外部访问,但按照习惯不应该这么做#利用types.MethodType()把一个函数变为一个方法import typesdef fn_get_grade(self):    if self.score >= 80:        return 'A'    if self.score >= 60:        return 'B'    return 'C'class Person(object):    def __init__(self, name, score):        self.name = name        self.score = scorep1 = Person('Bob', 90)p1.get_grade = types.MethodType(fn_get_grade, p1)print(p1.get_grade())p2 = Person('Hansen', 75)# print(p2.get_grade())  # 会报错,告诉你 属性不存在# 和属性类似,方法也分实例方法和类方法class Person(object):    count = 0    @classmethod  # 通过该标记,方法将绑定到类上,而非类的实例,通常将参数名命名为cls    def how_many(cls):        return cls.count    @property  # 像访问属性一样调用方法    def getName(self):        return self.name    def __init__(self, name):        self.name = namePerson.count = Person.count + 1print(Person.how_many())p1 = Person('Tim')print(Person.how_many())print(p1.getName)# 因为是在类上调用,而非实例上调用,因此类方法无法获得任何实例变量,只能获得类引用# 类的继承# 多态:同一方法会有不同的反馈和流程class Person(object):    def __init__(self, name, gender):        self.name = name        self.gender = genderclass Student(Person):    def __init__(self, name, gender, score):        super(Student, self).__init__(name, gender)  # 继承Person的name和gender        self.score = scoreclass Teacher(Person):    def __init__(self, name, gender, course):        super(Teacher, self).__init__(name,gender)        self.course = coursep = Person('Bob', 'Male')s = Student('Alice', 'Female', 90)t = Teacher('David', 'Male', 'Math')isinstance(p, Person)  # 判断p的类型isinstance(s, Person) dir(s)  # 获取变量的所有属性getattr(s, 'name')  # 获得name属性, 若属性不存在则报错getattr(s, 'name', 'Bob')  # 获得name属性, 若属性不存在则返回默认值'Bob'setattr(s, 'name', 'Hansen')# 比较运算符# __cmp__(self, other)# __eq__(self, other)# __lt__(self, other)# __gt__(self, other)# 数字运算符# __add__(self, other)# __sub__(self, other)  # 减# __mul__(self, other)# __div__(self, other)  # 除# 逻辑运算符# __or__(self, other)# __and__(self, other)# 转为字符串# __str__# __repr__# __unicode__

原创粉丝点击