类与对象的使用

一、类是一系列对象相同的特征(变量)与技能(函数)的结合体,即类体中最常见的就是变量与函数的定义

但其实类体中是可以存在任意python代码的

类体代码会在定义阶段立即执行,会产生一个类名称空间,用来将类体代码执行过程中产生的名字都丢进去

类的作用主要有两点:

1.当做名称空间从其内部取出名字来使用

2.用来产生对象

二、绑定方法

类中定义的变量是类的数据属性,类可以用,对象也可以用,大家都指向同一个内存地址,类变量值一旦改变,所有对象都跟着变

类中定义的函数时类的函数属性,类可以用,类来调用就是一个普通的函数,但其实类中定义的函数是给对象用的,而且是绑定给对象用的

三、继承

继承是一种新建类的方式,新建的类称之为子类或派生类,被继承的类称之为父类/基类/超类

python中继承的特点:

1.子类可以重用父类属性

2.python中一个子类可以同时继承多个父类

3.目前分为两种类

新式类:但凡继承了object的类,以及该类的子类,都是新式类,在python3中一个类即使是没有显式的继承任何类,默认就会继承object类

经典类:没有继承object的类,以及该类的子类..都是经典类。在python2中才区分新式类与经典类。python2中一个类如果没有显式地继承任何类,也不会继承object类

继承的作用:减少代码冗余

在子类派生出的新方法中重用父类功能的方式一:指名道姓地引用某一个类中的函数

class OldPeople:
    school='oldboy'
    def __init__(self,name,age,sex):
        self.name=name
        self.age=age
        self.sex=sex

class OldboyStudent(OldPeople):
    def __init__(self,name,age,sex,score=0):
        OldPeople.__init__(self,name,age,sex)
        self.score=score
    def choose_course(self):
        print('%s choosing course'%self.name)

stu1=OldboyStudent('刘二蛋',38,'male')
print(stu1.__dict__)
View Code

在子类派生出的新方法中重用父类功能的方式二:super()

super继承的顺序是参照mro表

# 在子类派生出的新方法中重用父类功能的方式二:super()必须在类中用
# 在python2中:super(自己的类名,自己的对象)
# 在python3中:super()
# 调用该函数会得到一个特殊的对象,该对象专门用来访问父类中的属性,!!!完全参照mro列表!!!!
# 总结:
# 1. 严格依赖继承的mro列表
# 2. 访问是绑定方法,有自动传值的效果
class OldboyPeople:
    school = 'oldboy'

    def __init__(self, name, age, sex):
        self.name = name
        self.age = age
        self.sex = sex


class OldboyStudent(OldboyPeople):
    def __init__(self, name, age, sex, score=0):
        super(OldboyStudent, self).__init__(name, age, sex)
        self.score = score

    def choose_course(self):
        print('%s choosing course' % self.name)

class OldboyTeacher(OldboyPeople):
    def __init__(self,name,age,sex,level=1):
        super().__init__(name,age,sex)
        self.level=level

stu1=OldboyStudent('刘二蛋',38,'male')
print(stu1.__dict__)

tea1=OldboyTeacher('egon',18,'male',10)
print(tea1.__dict__)
View Code

四、在单继承背景下属性查找

优先级:对象----对象的类-------父类--------父类

class Foo:
    x=444
class Bar1(Foo):
    # x=333
    pass
class Bar2(Bar1):
    # x=222
    pass
lqz=Bar2()
print(lqz.x)
View Code

五、在多继承背景下属性查找

1.如果一个子类继承多个分支(多个分支没有共同继承一个非object类)

此时属性的查找优先级是:对象-->对象的类-->按照从左往右的顺序一个分支一个分支的查找下去

# 第四层:
class G:
    # x = 'G'
    pass

# 第三层
class E(G):
    x = 'E'
    pass

class F:
    # x = 'F'
    pass

# 第二层
class B(E):
    # x = 'B'
    pass

class C(F):
    x = 'C'
    pass

class D:
    x = 'D'
    pass

# 第一层
class A(B, C, D):
    # x = 'A'
    pass

obj = A()
# obj.x = 111
print(obj.x)
print(A.mro())
View Code

2.菱形继承问题

新式类:广度优先查找,从左往右一个分支一个分支的查找,在最后一个分支才去查找顶级类

经典类:深度优先查找,从左往右一个分支一个分支的查找,在第一个分支就查找顶级类

# 第四层:
class G(object):
    # x = 'G'
    pass

# 第三层
class E(G):
    # x = 'E'
    pass

class F(G):
    # x = 'F'
    pass

# 第二层
class B(E):
    # x = 'B'
    pass

class C(F):
    # x = 'C'
    pass

class D(G):
    # x = 'D'
    pass

# 第一层
class A(B, C, D):
    x = 'A'
    pass


obj=A()
# obj.x=111
print(obj.x)
print(A.mro())
View Code

3.python专门为新式类内置了一个mro的方法,用来查看c3算法,也就是属性查找顺序

print(A.mro())

 

转载于:https://www.cnblogs.com/xufengnian/p/10562022.html

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值