Python常用语法汇总(七):双下划线含义、MethodType把函数变为方法以及类继承

不多说,直接给出学习代码记录

# python对属性 权限的控制是通过属性名来实现的
# 如果一个属性由双下划线开头(__),则该属性就无法被外部访问
# 例1. 双下划线开头的属性不能直接被外部访问
class Person(object):  # 继承object类得到新式类
    def __init__(self, name):
        self.name = name
        self._sex = 'M'
        self.__age = 20
p = Person('Alice')
print(p.name)
print(p._sex)
# print(p.__age)  # 这个地方会报错,告诉你该属性不存在
print(p.__dict__)  # 可以看到其他属性都没变,但__age变成了_Person__age
print(p._Person__age)  # 这样就可以访问到__age属性了

# 如果一份属性以"__xx__"的形式定义,那么它又可以被外部访问了
# 因为以"__xx__"定义的属性在python中称为特殊属性,有很多预定义的特殊属性可以使用
#以单下划线开头的属性虽然也可以被外部访问,但按照习惯不应该这么做

#利用types.MethodType()把一个函数变为一个方法
import types
def 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 = score
p1 = 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 = name
Person.count = Person.count + 1
print(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 = gender
class Student(Person):
    def __init__(self, name, gender, score):
        super(Student, self).__init__(name, gender)  # 继承Person的name和gender
        self.score = score
class Teacher(Person):
    def __init__(self, name, gender, course):
        super(Teacher, self).__init__(name,gender)
        self.course = course
p = 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__

  • 3
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

Trisyp

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值