Python面相对象编程的知识总结

Python基础 09/29 阅读 517 views次 人气 0
摘要:

面相对象的概念:类(Class)、类变量、数据成员、方法重载、实例变量、继承、实例化、方法、对象、多继承。

1、类(Class): 用来描述具有相同的属性和方法的对象的集合。它定义了该集合中每个对象所共有的属性和方法,对象是类的实例。

2、类变量:类变量在整个实例化的对象中是公用的,类变量定义在类中且在函数体之外,类变量通常不作为实例变量使用。

3、数据成员:类变量或者实例变量, 用于处理类及其实例对象的相关的数据。

4、方法重载:如果从父类继承的方法不能满足子类的需求,可以对其进行改写,这个过程叫方法的覆盖(override),也称为方法的重写。

5、实例变量:定义在方法中的变量,只作用于当前实例的类。

6、继承:即一个派生类(derived class)继承基类(base class)的字段和方法。继承也允许把一个派生类的对象作为一个基类对象对待。

7、实例化:创建一个类的实例,类的具体对象。

8、方法:类中定义的函数。

9、对象:通过类定义的数据结构实例。对象包括两个数据成员(类变量和实例变量)和方法。

10、多继承:Python支持多继承。


class User:
    height=1.65
    weight=120
    def __init__(self,name,height,weight):
        self.name=name
        self.height=height
        self.weight=weight
    def info(self):
        print(self.__class__)
        print("姓名:",self.name,",身高:",self.height,",体重:" ,self.weight)
zhangsan = User("张三",1.65,120)
zhangsan.info()
lisi = User("李四",1.55,140)
lisi.info()
print(id(zhangsan), id(lisi))
print(zhangsan==lisi)
print(isinstance(zhangsan,User))
print(isinstance(lisi,User))
print(type(zhangsan)==User)
print(type(lisi)==User)

输出:
<class '__main__.User'>
姓名: 张三 ,身高: 1.65 ,体重: 120
<class '__main__.User'>
姓名: 李四 ,身高: 1.55 ,体重: 140
35704904 35707816
False
True
True
True
True

结论:

1、_init__()方法是一种特殊的方法,被称为类的构造函数或初始化方法,当创建了这个类的实例时就会调用该方法

2、self代表类的实例,self在定义类的方法时是必须有的。


class User:
    height=1.65
    weight=120
    def __init__(self,name,height,weight):
        self.name=name
        self.height=height
        self.weight=weight
    def info(self):
        print(self.__class__)
        print("姓名:",self.name,",身高:",self.height,",体重:" ,self.weight)
class Admin(User):
    def setName(self,name):
        User.name = name;
    def setHeight(self,height):
        User.height = height;
    def setWeight(self,weight):
        User.weight = weight;
    def info(self):
        print(self.__class__)
        print(User.__class__)
        print("姓名:", User.name, ",身高:", User.height, ",体重:", User.weight)
zhangsan = Admin("",0,0);
zhangsan.setName("张三")
zhangsan.setHeight(1.65)
zhangsan.setWeight(120)
zhangsan.info()
lisi = Admin("李四",1.55,140)
lisi.info()

输出:
<class '__main__.Admin'>
<class 'type'>
姓名: 张三 ,身高: 1.65 ,体重: 120
<class '__main__.Admin'>
<class 'type'>
姓名: 张三 ,身高: 1.65 ,体重: 120
class P1:
    def foo(self):
        print('p1-foo')
class P2:
    def foo(self):
        print('p2-foo')
    def bar(self):
        print('p2-bar')
class C1(P1, P2):
    pass
class C2(P1, P2):
    def bar(self):
        print( 'C2-bar')
class D(C1, C2):
    pass
d=D()
d.foo()
d.bar()

输出:
p1-foo
C2-bar

结论:

1、实例d调用foo()时,搜索顺序是:D => C1 => C2 => P1

2、实例d调用bar()时,搜索顺序是:D => C1 => C2

3、可以看出,新式类的搜索方式是采用“广度优先”的方式去查找属性。

4、pass关键字,不做任何事情,一般用做占位语句。

其中:

1、共有变量,直接字母开头。

2、私有变量,使用__开头。

3、@classmethod,装饰器函数。


评论

该文章不支持评论!

分享到: