一、类与对象

1、什么是类?
类,顾名思义,就是具体相同属性的同一类事物的统称及抽象。
对象,指是就是具体的抽象类的实例

以上的说法是不是看起来有点云里来雾里去呢。没错,专业的解释总是让人难以理解,这就是专家。其实举个简单的例子大家就能理解了
如:牛马羊鸡鸭鹅,这些都是统称为 动物,没错吧。那动物就是上面所谓的类,而牛马羊鸡鸭鹅就是类中对应的实例,也就是对象。牛是对象,羊是对象,。。。现在明白了吧

python类是怎么定义和使用的,废话少说,上图,一目了然

python之面向对象那点事

 

2、类的成员:从上图可以看到,类包含了很多成员,那类中成员的分类是怎样的呢,看下图

python之面向对象那点事

3、类的三大特性:封装,继承,多态(python多态用得非常少)

何为封装:先来看个小问题,比如说要对数据库进行增删改查操作,那么我们可以定义4个函数用于实现这些功能。但每次调用这些函数时我们就必须给这些函数传参数,必须告诉这些函数要所边的数据库实例,用户名,密码,端口号等信息。这样一个,每一次的调用都是传这些相同的信息。1、是不是有更好的方法来使用这个重复的操作呢?2、另对于面向函数的调用,事实我们并不知道到底是谁用了函数。

对于面向对象来说,封装的概念实际上就是用于解决此类场景所产生的问题的。事实上我们可以这些公用的信息都放在构造函数中的参数中,即当实例化一个对象时就给这个对象赋予了这些信息,然后方法的调用就不用再重复在函数中传入这些参数了。调用方法时用指定的对象去调用这些方法,就知道是谁调用了,举个例子就清楚了

 1 >>> #函数实现
 2 ... 
 3 >>> def fetch(conn_info):
 4 ...     print "use %s conn to db for fetch" % conn_info
 5 ... 
 6 >>> def modify(conn_info):
 7 ...     print "use %s conn to db for modify" % conn_info
 8 ... 
 9 >>> #函数调用,每调用一次都需要传入参数
10 ... fetch('scott 123 127.0.0.1')
11 use scott 123 127.0.0.1 conn to db for fetch
12 >>> modify('scott 123 127.0.0.1')
13 use scott 123 127.0.0.1 conn to db for modify
14 >>> 
15 >>> #类实现
16 ... class A:
17 ...     def __init__(self,conn_info):
18 ...         self.conn_info = conn_info
19 ...     def fetch(self):
20 ...         print "use %s conn to db for fetch" % self.conn_info
21 ...     def modify(self):
22 ...         print "use %s conn to db for modify" % self.conn_info
23 ... 
24 >>> #类调用
25 ... #实例化一个对象,指明了谁(obj)调用,且公用参数只需要在实例化时传一次就行了
26 ... obj = A('scott 123 127.0.0.1')
27 >>> obj.fetch()
28 use scott 123 127.0.0.1 conn to db for fetch
29 >>> obj.modify()
30 use scott 123 127.0.0.1 conn to db for modify
31 >>> 

 

4、类的继承

什么是继承?比如说两个人A和B,A可以行走吃喝,B也可以行走吃喝,且B还可以画画,而A却不会,那么我们就可以说B继承于A

#继承的定义
class A:
    def func1(self):
        print "func1"

class B(A):
    def func2(self):
        print "func2"

##实例化对象
obj2 = B()
##调用父类方法
obj2.func1()

以上代码就指明了B类继承于A类,是不是很简单,且继承了A类(父类后就可以通过对象调用你类的方法了)

 

5、多继承:那么一个类只能继承于另一个类吗,是否可以继承于多个类,答案是肯定了,这个是python特有,其它语言并没有这个特性。问题来了,如果一个类D继承于B,C两个类,B,C两个类均继承于A类,B类没有方法func,C类有方法func,A类也有方法func,那D类实例化后调用func方法到底是调用哪个类的方法呢?

举个例子就清楚了,在看例子之前,先说下python中类的分类(为什么?因为以上问题分两种情况,经典类与新式类是有所不同的),在python中类分为经典类和新式类,定义新式类只需要在定义指明该类继承于object类即可,如下 

#经典类
class A:
    pass

#新式类
class B(object):
    pass
##经典类的多继承
class A:
    def func(self):
        print "funcA"

class B(A):
    pass

class C(A):
    def func(self):
        print "funcC"

class D(B,C):
    pass

#实例化对象
obj = D()
#函数调用,打印funcA
obj.func()

##新式类的多继承
class A(object):
    def func(self):
        print "funcA"

class B(A):
    pass

class C(A):
    def func(self):
        print "funcC"

class D(B,C):
    pass

#实例化对象
obj = D()
#新式类函数调用,打印funcC
obj.func()
经典类与新式类方法调用顺序示例代码

相关文章:

猜你喜欢
  • 2022-12-23
  • 2021-08-03
  • 2021-08-02
相关资源
相似解决方案