本节内容
- 1.面向过程VS面向对象
- 2.面向对象
- 1.Class类(模版)
- 2.构造与析构函数
- 3.类变量与实例变量
- 4.Object对象
- 5.Encapsulation封装
- 6.Inheritance继承
- 7.Polymorphism多态
- 8.静态方法
- 9.类方法
- 10.属性方法
- 11.类的特殊成员方法
- 3.反射
一、面向过程VS面向对象
(1) 编程
语法+数据结构+算法组合成的代码
(2) 编程范式
本质上代表针对各种类型的任务采取不同的解决问题思路。
-
面向过程(Procedual Programming)- Use a list of instruction to tell computer what to do(使用一系列指令告诉计算机要做什么)- step-by-setp- 适用于写简单的脚本,做一些一次性的任务
-
面向对象OOP(Object-Oriented Programming)- 适用于复杂的、且需要不断迭代和维护的任务
(3) 面向对象优点
- 程序的维护和扩展更简单
- 大大提高程序开发效率
- 使人更容易理解代码逻辑
二、面向对象
1、Class类(模版)
对一类拥有相同属性对象的抽象、蓝图、原型
类中定义类这些对象都具备的属性、共同的方法
Object是类的一个实例,类是type类的一个实例
2、构造与析构函数
-
构造函数,__init__(self[,形参])实例化时做一些初始化的工作
-
析构函数,__del__(self)实例释放、销毁的时候执行,通常做一些收尾工作,如关闭一些数据库连接,打开的临时文件(Python会自动调用析构函数)。
3、类变量与实例变量
实例取变量先在实例本身中找,若找不到再去类中找
-
类变量作用域是所有实例,节省开销
-
实例变量也叫静态属性,作用域是实例本身
4、Object对象
一个对象即使一个类实例化后的实例
5、Encapsulation封装
在类中对数据的赋值、内部调用等操作对外部用户来说是透明的,这使类成了一个容器或胶囊,里面包含着类的数据和方法。
#类class
class dog:
n = 123 #类变量
def __init__(self,name):
'''
构造函数,在实例化时做一些类的初始化的工作
:param name:
'''
self.name = name #d1.name=name实例变量(静态属性),作用域就是实例本身
def bulk(self): #类的方法、功能 (动态属性)
print("%s: wang wang wang !"%self.name)
#对象object
d1 = dog("dog1")
d2 = dog("dog2")
d3 = dog("dog3")
6、Inheritance继承
一个类可以派生出子类,在这个父类里定义的属性、方法自动被子类继承(代码的重用)
除了继承方式可以代码重用外,还可用组合的方式,将object传给类中的类变量,如:
self.people = People(self,name,age)
继承顺序:
- 广度优先:先从继承的父类中,按照从左到右的顺序,依次去父类中查找。若没有找到,再去父类的父类中查找,依次向上
- 深度优先:先从继承的最左侧的父类中查找,若没有找到,再去父类的父类中查找,依次向上。若到最顶层类也查不到,按照从左到右顺序再去继承的第二个父类中查找,重复上述过程…
注意:
- Python2 经典类是按照深度优先来继承的,新式类是按照广度优先来继承的
- Python3 经典类和新式类都按照广度优先来继承
# class People: "经典类"
class People(object): #"新式类",推荐写法
def __init__(self,name,age):
self.name = name
self.age = age
self.friends = []
print("--doens't run ")
def eat(self):
print("%s is eating..." % self.name)
def talk(self):
print("%s is talking..." % self.name)
def sleep(self):
print("%s is sleeping..." % self.name)
class Relation(object):
def __init__(self,n1,n2):
print("init in relation")
def make_friends(self,obj): #w1
print("%s is making friends with %s" % (self.name,obj.name))
self.friends.append(obj.name)
class Man(Relation,People): #多继承
# def __init__(self,name,age,money): #重构父类构造函数
# #People.__init__(self,name,age) #"经典类"写法
# super(Man,self).__init__(name,age) #"新式类"写法,推荐写法
# self.money = money
# print("%s 一出生就有%s money" %(self.name,self.money))
def piao(self):
print("%s is piaoing ..... 20s....done." % self.name)
def sleep(self): #重构父类方法
People.sleep(self)
print("man is sleeping ")
class Woman(People,Relation):
def get_birth(self):
print("%s is born a baby...." % self.name)
m1 = Man("NiuHanYang",22)
# w1 = Woman("ChenRonghua",26)
#
# m1.make_friends(w1)
# w1.name = "陈三炮"
# print(m1.friends[0])
7、Polymorphism多态
重要特性(一个接口,多种实现)
指一个基类中派生出不同的子类,子类不仅继承里父类同样的方法名,同时也可以对父类的方法做不同的实现
8、静态方法
在方法前加@staticmethod,方法就变成了一个普通函数,只不过需要通过类名或者实例名来调用,不能调用 类的self。只是名义上归类管理,实际上在静态方法里访问不了类或实例中的任何属性。
class Dog(object):
def __init__(self,name):
self.name = name
@staticmethod #实际上跟类没什么关系了
def eat(self):
print("%s is eating %s" %(self.name,'dd'))
def talk(self):
print("%s is talking"% self.name)
d = Dog("ChenRonghua")
d.eat(d)
d.talk()
9、类方法
在方法前加@classmethod,只能访问类变量,不能访问实例变量
class Dog(object):
#n = 333
#name = "huazai"
def __init__(self,name):
self.name = name
#self.n = 333
@classmethod #只能访问类变量,不能访问实例变量
def eat(self):
print("%s is eating %s" %(self.name,'dd'))
def talk(self):
print("%s is talking"% self.name)
d = Dog("ChenRonghua")
d.eat()
'''''
AttributeError: type object 'Dog' has no attribute 'name'
'''
10、属性方法
在方法前加@property,把方法变成一个静态属性(实例变量)
class Dog(object):
'''''这个类是描述狗这个对象的'''
def __init__(self,name):
self.name = name
self.__food = None
@property #attribute
def eat(self):
print("%s is eating %s" %(self.name,self.__food))
@eat.setter #传参
def eat(self,food):
print("set to food:",food)
self.__food = food
@eat.deleter #删除
def eat(self):
del self.__food
print("删完了")
def talk(self):
print("%s is talking"% self.name)
def __call__(self, *args, **kwargs):
print("running call",args,kwargs)
def __str__(self):
return "<obj:%s>" %self.name
#print(Dog.__dict__) #打印类里的所有属性,不包括实例属性
d = Dog("ChenRonghua")
print(d)
# print(d.__dict__) #打印所有实例属性,不包括类属性
# d(1,2,3,name=333)
#Dog("ChenRonghua")()
11、类的特殊成员方法
详细使用参考 http://www.cnblogs.com/alex3714/articles/5213184.html
__doc__ #类的描述信息 __module__ #当前操作的对象在哪个模块 __class__ #当前操作对象类名 __init__ #构造函数 __del__ #析构函数 __call__ #在类中加入,类就可以调用。调用方法:对象后加() __dict__ #class_name.__dict__或object_name.__dict__,以字典的形式打印类或实例下所有的方法、属性 __str__ #如果在类中定义了__str__方法,那么在打印对象时,默认输出该方法的返回值 __getitem__ # __setitem__ # __delitem__ #用于索引操作,如字典。以上分别表示获取、设置、删除数据 __new__ #用来创建实例的 __metaclass #用来表示该类由谁来实例化创建
三、反射
通过字符串映射或修改程序运行时的状态、属性、方法(变量)
def bulk(self):
print("%s is yelling...." %self.name)
class Dog(object):
def __init__(self,name):
self.name = name
def eat(self,food):
print("%s is eating..."%self.name,food)
d = Dog("NiuHanYang")
choice = input(">>:").strip()
if hasattr(d,choice): #判断对象中是否有字符串对应的方法
getattr(d,choice) #获取方法或变量内存地址
else:
setattr(d,choice,bulk) #(object,attribute,value),相当于d.talk = bulk
func = getattr(d, choice)
func(d)
#delattr(d,choice) #(object,attribute)
参考:
http://www.cnblogs.com/alex3714/articles/5188179.html
http://www.cnblogs.com/alex3714/articles/5213184.html

浙公网安备 33010602011771号