一、类与对象

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

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

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

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

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

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

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

 >>> #函数实现
...
>>> def fetch(conn_info):
... print "use %s conn to db for fetch" % conn_info
...
>>> def modify(conn_info):
... print "use %s conn to db for modify" % conn_info
...
>>> #函数调用,每调用一次都需要传入参数
... fetch('scott 123 127.0.0.1')
use scott 123 127.0.0.1 conn to db for fetch
>>> modify('scott 123 127.0.0.1')
use scott 123 127.0.0.1 conn to db for modify
>>>
>>> #类实现
... class A:
... def __init__(self,conn_info):
... self.conn_info = conn_info
... def fetch(self):
... print "use %s conn to db for fetch" % self.conn_info
... def modify(self):
... print "use %s conn to db for modify" % self.conn_info
...
>>> #类调用
... #实例化一个对象,指明了谁(obj)调用,且公用参数只需要在实例化时传一次就行了
... obj = A('scott 123 127.0.0.1')
>>> obj.fetch()
use scott 123 127.0.0.1 conn to db for fetch
>>> obj.modify()
use scott 123 127.0.0.1 conn to db for modify
>>>

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()

经典类与新式类方法调用顺序示例代码

执行结果:

 >>> ##经典类的多继承
... 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()
funcA
>>>
>>> ##新式类的多继承
... 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()
funcC

#从以上结果可以看出
经典类的查找是以深度优先为原则的,查询顺序:D->B->A,如果找不到,就报错,找到就调用
新式类的查询是以广度优先为原则的,查询顺序:D->B->C->A,如果找不到,就报错,找到就调用

6、类中常用的特殊成员
类名.__doc__ :打印类的注释信息(指用'''/"""引起来的注释信息)
类名/对象.__dict__: 返回类或对象包含的成员字典
__call__:在类中定义这个方法,事实上就是执行 对象() 调用的方法 
__str__:如果一个类中定义了__str__方法,那么在打印 对象 时,默认输出该方法的返回值 

7、其它相关
isinstance(obj, cls):检查是否obj是否是类 cls 的对象
issubclass(sub, super):检查sub类是否是 super 类的派生类

8、类的常用操作示例

class Person:
class_v = 'beautiful' #静态字段/类变量
salary = 10000
__private_v = 'you can\'t read me from outside' #私有类变量
def __init__(self,name,age):
self.name = name ##普通字段
self.age = age
__male = 'girl' #静态私有字段
self.favorite = 'cat'
def speak(self,des): ##普通方法
print "I'm {0},age {1},today is a {2} day!,so {3}".format(self.name,self.age,Person.class_v,des)
@staticmethod
def static_m(): #静态方法
print "This is a static method!"
@classmethod #类方法
def class_m(cls,*args,**kwargs):
print "This is a class method!"
@property
def attr_m(self): #属性,其实就是方法的变种
return self.favorite #这里只是个例子,实际应用中一般是通过一定的逻辑处理得到相应的值
@attr_m.setter #设置属性值
def attr_m(self,value):
self.favorite = value
return self.favorite
@attr_m.deleter #删除属性值
def attr_m(self):
del self.favorite
def read_private(self): ##普通方法
print Person.__private_v class wo(Person): #继承
def __init__(self,name):
self.name = name
def des(self):
print "%s is a lovely girl!" % self.name #类的实例化
obj = Person('min',18)
#访问类变量
print obj.salary
print Person.salary
obj.salary += 2000
print obj.salary
print Person.salary
Person.salary += 50000
print obj.salary
print Person.salary
##从上述结果可看出通过对象访问类变量并对其做修改并不影响在变量的值 #普通方法调用
obj.speak('nice')
#调用静态方法,必须通过类调用
Person.static_m()
#调用类方法,必须通过类调用
Person.class_m()
#访问属性
obj.attr_m
obj.attr_m = 'always cat!'
print obj.attr_m
del obj.attr_m
#测试私有类变量的打印 
obj.read_private()
#访问继承类的方法
min = wo('min')
min.des() #访问类变量
Person.class_v
#访问私有类变量
Person.__private_v ##无法访问
obj._Person__private_v #强制访问私有成员

类的常用操作示例代码

执行结果:

 >>> class Person:
... class_v = 'beautiful' #静态字段/类变量
... salary = 10000
... __private_v = 'you can\'t read me from outside' #私有类变量
... def __init__(self,name,age):
... self.name = name ##普通字段
... self.age = age
... __male = 'girl' #静态私有字段
... self.favorite = 'cat'
... def speak(self,des): ##普通方法
... print "I'm {0},age {1},today is a {2} day!,so {3}".format(self.name,self.age,Person.class_v,des)
... @staticmethod
... def static_m(): #静态方法
... print "This is a static method!"
... @classmethod #类方法
... def class_m(cls,*args,**kwargs):
... print "This is a class method!"
... @property
... def attr_m(self): #属性,其实就是方法的变种
... return self.favorite #这里只是个例子,实际应用中一般是通过一定的逻辑处理得到相应的值
... @attr_m.setter #设置属性值
... def attr_m(self,value):
... self.favorite = value
... return self.favorite
... @attr_m.deleter #删除属性值
... def attr_m(self):
... del self.favorite
... def read_private(self): ##普通方法
... print Person.__private_v
...
>>> class wo(Person): #继承
... def __init__(self,name):
... self.name = name
... def des(self):
... print "%s is a lovely girl!" % self.name
...
>>> #类的实例化
... obj = Person('min',18)
>>> #访问类变量
... print obj.salary
10000
>>> print Person.salary
10000
>>> obj.salary += 2000
>>> print obj.salary
12000
>>> print Person.salary
10000
>>> Person.salary += 50000
>>> print obj.salary
12000
>>> print Person.salary
60000
>>> ##从上述结果可看出通过对象访问类变量并对其做修改并不影响在变量的值
...
>>> #普通方法调用
... obj.speak('nice')
I'm min,age 18,today is a beautiful day!,so nice
>>> #调用静态方法,必须通过类调用
... Person.static_m()
This is a static method!
>>> #调用类方法,必须通过类调用
... Person.class_m()
This is a class method!
>>> #访问属性
... obj.attr_m
'cat'
>>> obj.attr_m = 'always cat!'
>>> print obj.attr_m
always cat!
>>> del obj.attr_m
>>> #测试私有类变量的打印 
... obj.read_private()
you can't read me from outside
>>> #访问继承类的方法
... min = wo('min')
>>> min.des()
min is a lovely girl!
>>>
>>> #访问类变量
... Person.class_v
'beautiful'
>>> #访问私有类变量
... Person.__private_v ##无法访问
Traceback (most recent call last):
File "<stdin>", line 2, in <module>
AttributeError: class Person has no attribute '__private_v'
>>> obj._Person__private_v #强制访问私有成员
"you can't read me from outside"
>>>

python之面向对象那点事的更多相关文章

  1. python学习------面向对象的程序设计

    一 面向对象的程序设计的由来 1940年以前:面向机器 最早的程序设计都是采用机器语言来编写的,直接使用二进制码来表示机器能够识别和执行的指令和数 据.简单来说,就是直接编写 和 的序列来代表程序语言 ...

  2. [ python ] 初始面向对象

    首先,通过之前学习的函数编写一个 人狗大战 的例子. 分析下这个需求,人 狗 大战  三个事情.角色:人.狗动作:狗咬人,人打狗 先创建人和狗两个角色: def person(name, hp, ag ...

  3. python初始面向对象

    阅读目录 楔子 面向过程vs面向对象 初识面向对象 类的相关知识 对象的相关知识 对象之间的交互 类命名空间与对象.实例的命名空间 类的组合用法 初识面向对象小结 面向对象的三大特性 继承 多态 封装 ...

  4. Python 【面向对象】

    前言 Python从设计之初就已经是一门面向对象的语言,正因为如此,在Python中创建一个类和对象是很容易的.本章节我们将详细介绍Python的面向对象编程. 如果你以前没有接触过面向对象的编程语言 ...

  5. python基础——面向对象编程

    python基础——面向对象编程 面向对象编程——Object Oriented Programming,简称OOP,是一种程序设计思想.OOP把对象作为程序的基本单元,一个对象包含了数据和操作数据的 ...

  6. Python的面向对象3

    接下来,我们接着讲Python的面向对象,在上一次的博客中,我们详细介绍了类与对象的属性,今天,我们来详细介绍一下面向对象中的方法! 1.定义实例方法 一个实例的私有属性就是以__开头的属性,无法被外 ...

  7. Python的面向对象2

    我们接着讲解Python的面向对象 1.初始化实例属性 在现实生活中,一种类型的实例会具有相同的某些属性,把这些实例划分为一个类型,则这些实例必然有相似的部分.但是,在创建实例之后,我们一个一个的为实 ...

  8. Python的面向对象1

    今天,我们来介绍Python的面向对象编程,其实面向对象并不陌生,在C++  ,Java  ,PHP中也有大量使用! 好了,我们来步入正题! 那什么是面向对象编程呢? 1. 面向对象编程是一种程序设计 ...

  9. My way to Python - Day05 - 面向对象-思维导图

    My way to Python - Day05 - 面向对象   思维导图

随机推荐

  1. cookie的expires属性和max-age属性

    expires属性 指 定了coolie的生存期,默认情况下coolie是暂时存在的,他们存储的值只在浏览器会话期间存在,当用户推出浏览器后这些值也会丢失,如果想让 cookie存在一段时间,就要为e ...

  2. 一个证书多次使用-导出p12文件

    在苹果开发者网站申请的证书,是授权mac设备的开发或者发布的证书,这意味着一个设备对应一个证书,但是99美元账号只允许生成3个发布证书,两个开发证书,这满足不了多mac设备的使用,使用p12文件可以解 ...

  3. Fast InvSqrt()(平方根倒数速算法)

    浮点数的平方根倒数常用于计算正规化矢量.3D图形程序需要使用正规化矢量来实现光照和投影效果,因此每秒都需要做上百万次平方根倒数运算,而在处理坐标转换与光源的专用硬件设备出现前,这些计算都由软件完成,计 ...

  4. C++中引用用于结构

    正确 void change(test &target) { target.name = "aaa"; } 错误 void change(const test &t ...

  5. Java 工厂模式学习

    工厂模式分三种:简单工厂.工厂方法.抽象工厂.其中抽象工厂是用于多个产品族的情况.所谓产品族就是不同产品组成的有机整体,各不同产品之间相互依赖.打个比方,一台电脑有CPU.主板.内存和硬盘等,这些不同 ...

  6. Java 7源码分析第13篇 - 字节输入输出流(1)

    上一篇介绍了关于字节输入输出流的Java类框架,同时也简单介绍了一下各个类的作用,下面就来具体看一下这些类是怎么实现这些功能的. 1.InputStream和OutputStream InputStr ...

  7. javascript正则表达式/g与/i及/gi的意义

    regularexpression=/pattern/[switch] 这个switch就有三种值 g: 全局匹配 i: 忽略大小写 gi: 全局匹配 + 忽略大小写 JScript 语言参考 --- ...

  8. CSS3 transition 属性

    transition是css3中新添加的特性,在W3C标准中是这样描述的:“css的transition允许css的属性值在一定的时间内从一个状态平滑的过渡到另一个状态.这种状态可以在鼠标单击.获得焦 ...

  9. GoF——抽象工厂模式

    抽象工厂模式:提供一个创建一系列相关或相互依赖对象的接口,而无需指定它们具体的类.

  10. VB EditGrid的用法

    百度了一下,关于vb 6.0 EditGrid的用法 查不到资料