面向对象和类
面向过程和面向对象编程
- 面向过程编程:函数式编程,C语言等
- 面向对象编程:C++,Java,Python等
类和对象
类和对象是面向对象中的两个重要概念
- 类:是对事物的抽象,比如:人类、球类等
- 对象:是类的一个实例,比如:足球、篮球等
类用来描述具有相同的属性和方法的对象的集合。它定义了该集合中每个对象所共有的属性和方法。
实例说明:球类可以对球的特征和行为进行抽象,然后可以实例化一个真实的球实体出来。
面向对象的主要思想是:封装、继承和多态
方便解决比较复杂的问题,并且维护比较容易。
类定义:
类把需要的变量和函数组合到一起,这种包含称为“封装”
class A(object):
类名一般为首字母大写,多个单词组成的类名要单词的首字母都要大写。
类的结构:
class 类名:
成员变量–>属性
成员函数–>方法
类的创建
class MyClass(object):
var = "variable" #类的属性
def fun(self): #类的方法,参数可以有多个,但self参数必须要有
print "I am funcation"
类的方法中至少有一个参数“self”,“self”表示类本身。
#!/usr/bin/python
# -*- coding: utf-8 -*-
class People(object): #定义一个类
color = "yellow" #类的属性
def think(self): #类的方法
self.color = "black" #在方法中修改类属性
print "I am a %s" % self.color
print "I am a thinker"
ren = People() #实例化类
print ren.color #打印类的属性
ren.think() #执行类的方法
创建对象的过程称为实例化,当一个对象被创建后,包含三个方面的特性:对象句柄、属性和方法。
句柄用于区分不同的对象,上例中的“ren”即为对象句柄。
对象的属性和方法与类中的成员变量和成员函数对应。
obj = MyClasss() # 创建类的一个实例(对象)
通过对象来调用属性和方法
类的属性
类的属性按使用范围分为公有属性和私有属性,类的属性范围取决于属性的名称。
- 公有属性:在类中和类外都能调用的属性。
- 私有属性:不能在类外及被类以外的函数调用的属性。
定义方式:以“__”双下划线开始的成员变量就是私有属性。
可以通过instance._classname__attribute方式访问
如ren._People__age ren为对象名,People为类名,__age为私有属性名。不建议这样使用,建议通过类的方法调用私有属性。
- 内置属性:由系统在定义类的时候默认添加的,由前后双下划线构成,如__dict__、__module__。
#!/usr/bin/python
# -*- coding: utf-8 -*-
class People(object): #定义一个类
color = "yellow" #类的公有属性
__age = 30 #类的私有属性
def think(self): #类的方法
self.color = "black" #在方法中修改类属性
print "I am a %s" % self.color
print "I am a thinker"
print self.__age
ren = People() #实例化类
print ren.color #打印类的属性
ren.think() #执行类的方法
ren.color = "write" #修改对象的属性值
print ren.color
print ren.__dict__ #打印对象的内置属性
print People.color #打印类的公有属性
print People.__dict__ #打印类的内置方法
类的方法
方法的定义和函数一样,但需要self作为第一个参数。
类的方法分为:
- 公有方法:在类中和类外都能调用的方法。
- 私有方法:不能被类的外部调用,在方法前面加上“__”双下划线就是私有方法。
self参数:用于区分函数和类的方法(必须有一个self),self参数表示执行对象本身 - 类方法:被classmethod()函数处理过的函数,能被类所调用,也能被对象所调用(是继承关系)
- 静态方法:相当于“全局函数”,可以被类直接调用,可以被所有实例化对象共享,通过staticmethod()定义,静态方法没有self参数。
例子:
#!/usr/bin/python
# -*- coding: utf-8 -*-
class People(object): #定义一个类
color = "yellow" #类的公有属性
__age = 30 #类的私有属性
def think(self): #类的公有方法
self.color = "black" #在方法中修改类属性
print "I am a %s" % self.color
print "I am a thinker"
print self.__age
def __talk(self): #类的私有方法
print "I am talking with Tom."
def work(self):
print "Working..."
self.__talk() #调用类的私有方法
@classmethod #装饰器
def test(self): #加上上边的装饰器变成类方法
print "this is class method"
@staticmethod #装饰器
def test1(): #加上上边装饰器变为静态方法,没有self参数
print "this is static method"
jack = People()
jack.work() #对象调用类中的私有方法
jack.test() #对象调用类方法
People.test() #类调用类方法
People.test1() #类调用静态方法,对象也可以直接调用
注:python装饰器就是用于拓展原来函数功能的一种函数,这个函数的特殊之处在于它的返回值也是一个函数,使用python装饰器的好处就是在不用更改原函数的代码前提下给函数增加新的功能。