一级目录
二级目录
三级目录
面向对象编程
面向对象编程——Object Oriented Programming,简称OOP,是一种程序设计思想。OOP把对象作为程序的基本单元,一个对象包含了数据和操作数据的函数。
面向过程的程序设计把计算机程序视为一系列的命令集合,即一组函数的顺序执行。为了简化程序设计,面向过程把函数继续切分为子函数,即把大块函数通过切割成小块函数来降低系统的复杂度。
而面向对象的程序设计把计算机程序视为一组对象的集合,而每个对象都可以接收其他对象发过来的消息,并处理这些消息,计算机程序的执行就是一系列消息在各个对象之间传递。
python面向对象
在Python中,所有数据类型都可以视为对象,当然也可以自定义对象。自定义的对象数据类型就是面向对象中的类(Class)的概念。
面向对象 VS 面向过程 print_score.py 面向对象的设计思想是抽象出Class,根据Class创建Instance。 面向对象的抽象程度又比函数要高,因为一个Class既包含数据,又包含操作数据的方法。
类和实例
面向对象最重要的概念就是类(Class)和实例(Instance),必须牢记类是抽象的模板,比如Student类,而实例是根据类创建出来的一个个具体的“对象”,每个对象都拥有相同的方法,但各自的数据可能不同。
创建class和实例(classAndInstance.py)
class后面紧接着是类名,即Student,类名通常是大写开头的单词,紧接着是(object),表示该类是从哪个类继承下来的,继承的概念我们后面再讲,通常,如果没有合适的继承类,就使用object类,这是所有类最终都会继承的类。
class Student(object):
pass
zhangsan = Student()
zhangsan.name="zs"
print(zhangsan) # <__main__.Student object at 0x000001905B63C6A0>
print(zhangsan.__dict__) # {'name': 'zs'}
创建实例
类名():bart = Student() 自由地给一个实例变量绑定属性:bart.name=“bart” (name属性只绑定当前的bart实例)
init方法
类可以起到模板的作用, 由于类可以起到模板的作用,因此,可以在创建实例的时候,把一些我们认为必须绑定的属性强制填写进去. (类似于java成员变量)
注意到__init__方法的第一个参数永远是self,表示创建的实例本身,因此,在__init__方法内部,就可以把各种属性绑定到self,因为self就指向创建的实例本身。
有了__init__方法,在创建实例的时候,就不能传入空的参数了,必须传入与__init__方法匹配的参数,但self不需要传,Python解释器自己会把实例变量传进去
类函数
和普通的函数相比,在类中定义的函数只有一点不同,就是第一个参数永远是实例变量self,并且,调用时,不用传递该参数。除此之外,类的方法和普通函数没有什么区别,所以,你仍然可以用默认参数、可变参数、关键字参数和命名关键字参数。
数据封装
面向对象编程的一个重要特点就是数据封装。通过函数来访问这些数据.。这些封装数据的函数是和类本身是关联起来的,我们称之为类的方法
定义一个方法,除了第一个参数是self外,其他和普通函数一样。 调用一个方法,只需要在实例变量上直接调用,除了self不用传递,其他参数正常传入
class Student(object):
# 绑定name, score属性
def __init__(self, name, score):
self.__name = name
self.__score = score
# 类函数
def print_name(self):
print("%s's name is %s" %(self.__name, self.__name))
def get_grade(self):
if self.__score >= 90:
return 'A'
elif self.__score >= 60:
return 'B'
else:
return 'C'
bart = Student("bart",90)
bart.print_name()
print(bart.get_grade()) # get方法访问私有属性
print(bart._Student__name) # 实例名._Class__xxx访问私有属性
成员变量
- 例的变量名如果以__xx开
- 头,就变成了一个私有变量(private),只有内部可以访问,外部不能访问. self.__name .通过使用set__name(), get__name()方法进行赋值和访问
- 在Python中,变量名类似__xxx__的,也就是以双下划线开头,并且以双下划线结尾的,是特殊变量,特殊变量是可以直接访问的
- _xxx变量也请视为私有变量
- 私有变量__xxx, 被python解释器编译为_Class__xxx, 可以通过访问实例._Class__xxx
class Student(object):
def __init__(self, name, gender):
self.__name = name
self.__gender = gender
def get_gender(self):
return self.__gender
def set_gender(self,gender):
self.__gender = gender
继承和多态
对于静态语言(例如Java)来说,如果需要传入Animal类型,则传入的对象必须是Animal类型或者它的子类,否则,将无法调用run()方法。
对于Python这样的动态语言来说,则不一定需要传入Animal类型。我们只需要保证传入的对象有一个run()方法就可以了
获取对象信息
一个对象的引用时,如何知道这个对象是什么类型、有哪些方法
使用type()
判断基本类型, 引用类型, 函数 判断一个对象是否是函数怎么办? 使用types模块中的常量
使用isinstance()
对于class的继承关系来说,使用type()就很不方便。我们要判断class的类型,可以使用isinstance()函数。
使用dir()
如果要获得一个对象的所有属性和方法,可以使用dir()函数,它返回一个包含字符串的list,比如,获得一个str对象的所有属性和方法:
实例属性和类属性
实例属性会覆盖类属性, 建议实例属性不能与类属性相同. 实例属性在实例销毁时销毁
def demo_fun():
pass
zhangsan=Student("zhangsan", 50)
print(type("123"))
print(type(zhangsan))
print(type(123))
print(type(demo_fun))
import types
print(types.FunctionType==type(demo_fun))
print("if 'a' is str: %s" % isinstance('a', str) )
print("if (1,2,3) is a list: %s" & isinstance((1, 2, 3), (list, tuple)))
print("str's field:" + dir('ABC'))
|