码迷,mamicode.com
首页 > 其他好文 > 详细

类与对象的使用

时间:2019-03-19 23:10:36      阅读:166      评论:0      收藏:0      [点我收藏+]

标签:变量   col   img   course   完全   内存地址   二层   广度   gif   

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

但其实类体中是可以存在任意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())

 

类与对象的使用

标签:变量   col   img   course   完全   内存地址   二层   广度   gif   

原文地址:https://www.cnblogs.com/xufengnian/p/10562022.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!