类与对象的使用

Posted xufengnian

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了类与对象的使用相关的知识,希望对你有一定的参考价值。

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

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

 

以上是关于类与对象的使用的主要内容,如果未能解决你的问题,请参考以下文章

java 类与对象

Java面向对象--类与对象

43-类与类之间的关系说明

Java的类与对象

Java的类与对象

python类与对象的初识