赞
踩
编程思想分为面向对象和面向语言
什么是面向过程?
面向过程即以事物发生过程为主要目标进行编程(什么正在发生)
什么是面向对象?
面向对象即把一件事物为对象进行编程,每个对象都有属性和方法。
例如:人可以作为对象,属性有姓名、年龄、身高...方法有走、跑、跳...
车可以作为对象,属性有轮胎、车灯,方向盘...方法有载人、放音乐...
Python也支持面向对象的三大特征:封装、继承、多态
类:是对一些具有相同特征和行为的事物的分类,它是抽象的
对象:它是类的实例化,是具体的
类与对象的关系即模板与产品:模板只能有一个,但对象可以有很多个
我们通常用大驼峰命名法去命名一个类名
Python中定义类有两种:旧式类和新式类
在早期Python中,类不会默认继承object,而没有继承object的类为旧式类。而在python3之后,类会默认继承object类,继承了object的类为新式类
旧式类:
- class A:
- pass
新式类:
- class B(object):
- pass
现在一般都使用新式类
在Python中类中的属性分为两种:公有属性和私有属性
公有属性:可以在类内类外使用,没有限制
私有属性:只能在类内使用,但可以使用方法间接访问
私有属性定义时需在前面加上两个下划线(__)
- class A(object):
-
- #公有属性
- a = "public"
-
- #私有属性
- __b = "private"
-
- print("属性为"+a)
- print("属性为"+__b)
- test = A()
属性为public
属性为private
在Python中类中的方法分为两种:公有方法和私有方法
公有方法:可以在类内类外使用,没有限制
私有方法:只能在类内使用
私有属性定义时需在前面加上两个下划线(__)
- class A(object):
- def public(self):
- print("公有方法")
- def __private(self):
- print("私有方法")
- test = A()
- test.public()
- test._A__private()
公有方法
私有方法
Python中访问私有方法可以通过:实例化类._类__私有化方法
在Python的类中以__XX__命名的方法都是类中的内置方法即魔法函数
如何查看类中的内置函数:
print(dir(object))
['__class__', '__delattr__', '__dir__', '__doc__', '__eq__', '__format__', '__ge__', '__getattribute__', '__gt__', '__hash__', '__init__', '__init_subclass__', '__le__', '__lt__', '__ne__', '__new__', '__reduce__', '__reduce_ex__', '__repr__', '__setattr__', '__sizeof__', '__str__', '__subclasshook__']
类中常用的内置方法:
1、__init__对象初始化时,会被自动调用
可以使用__init__方法来控制对象初始化的过程
- def __init__(self,name,age,sex):
- self.name = name
- self.age = age
- self.sex = sex
2、__new__创建对象时,会被自动调用
3、__del__对象被从内存中销毁前,会被自动调用
4、__str__返回对象的描述信息,print函数输出使用
- class Animal(object):
- def __init__(self,name,age,sex):
- self.name = name
- self.age = age
- self.sex = sex
-
- def __str__(self):
- return "name = "+ self.name +""
-
- a = Animal("dog","2years","man")
- print(a)
name = dog
在使用__str__方法后用print函数去输出实例化对象时会输出__str__函数中给定的描述信息(属性为私有化也可被输出)
封装 继承 多态
在Python中定义类时,我们都需要将属性私有化,如何提供公开的方法去供外部访问和修改
- class Animal(object):
- def __init__(self,name,age,sex):
- self.__name = name
- self.__age = age
- self.__sex = sex
-
- a = Animal("dog","2years","man")
此例子中的属性都为私有属性,那我们如何去访问?
第一种封装方式:
在类中提供get方法和set方法供外部访问
- class Animal(object):
- def __init__(self,name,age,sex):
- self.__name = name
- self.__age = age
- self.__sex = sex
-
- #提供公开的get方法
- def get_name(self):
- return self.__name
-
- #提供公开的set方法
- def set_name(self,name):
- self.__name = name
-
- a = Animal("dog","2years","man")
- print(a.get_name())
- a.set_name("cat")
- print(a.get_name())
dog
cat
第二种封装方式:
使用porperty()函数,使用此函数的时候需要有get方法和set方法
- class Animal(object):
- def __init__(self,name,age,sex):
- self.__name = name
- self.__age = age
- self.__sex = sex
-
- #提供公开的get方法
- def get_name(self):
- return self.__name
-
- #提供公开的set方法
- def set_name(self,name):
- self.__name = name
-
- name = property(get_name,set_name)
- a = Animal("dog","2years","man")
- print(a.name)
- a.name = "cat"
- print(a.name)
dog
cat
注意:在类外修改属性时a.后需要跟接受property的变量
第三种封装方式:
通过装饰器@property在get方法上进行装饰
- class Animal(object):
- def __init__(self,name,age,sex):
- self.__name = name
- self.__age = age
- self.__sex = sex
-
- @property
- def name(self):
- return self.__name
-
- @name.setter
- def name(self,name):
- self.__name = name
-
-
- a = Animal("dog","2years","man")
- print(a.name)
- a.name = "cat"
- print(a.name)
dog
cat
类与类之间还有种关系,即继承
继承可以提高代码的利用率、复用率
object为所有类的父类,Python支持多继承class Son(father1,father2......),在多继承中需要注意继承顺序,在继承时它会按照继承顺序来继承,即优先级
- class father(object):
- def __init__(self):
- self.money =100
- self.home = "房子"
- def tell(self):
- print("ok")
-
- #儿子继承了父亲
- class son(father):
- pass
-
- if __name__ == '__main__':
- a = son()
- a.tell()
- print(a.money)
- print(a.home)
ok
100
房子
注意:子类可以继承父类的所有公有属性和公有方法
在子类继承父类后,父类中的方法不能满足子类的使用时,我们可以在子类中进行方法重写
方法重写时,子类与父类的方法名称、参数必须相同
在Python中有方法的重写,但是没有方法重载,但是可以实现方法的重载(装饰器)
方法重写示例:
- class father(object):
- def tell(self):
- print("我喜欢平平淡淡")
-
- #儿子继承了父亲
- class son(father):
- def tell(self):
- print("我喜欢赚钱")
-
- if __name__ == '__main__':
- a = son()
- a.tell()
我喜欢赚钱
super()关键字:它相当于一个指针,默认指向指针
- class father(object):
- def tell(self):
- print("我喜欢平平淡淡")
-
- #儿子继承了父亲
- class son(father):
- def tell(self):
- print("我喜欢赚钱")
-
- def test(self):
- self.tell()
- super().tell()
-
- if __name__ == '__main__':
- a = son()
- a.test()
我喜欢赚钱
我喜欢平平淡淡
多态基于继承的基础之上,一个对象的多种实现,即父类引用指向子类实例的现象
Python是弱数据语言,所以多态在python中显得不太重要,它在定义变量的时候不用声明数据类型,因此支持多态
- class father(object):
- def tell(self):
- print("我是父亲")
-
- #儿子继承了父亲
- class son(father):
- def tell(self):
- print("我是儿子")
-
- #女儿继承了父亲
- class daughter(father):
- def tell(self):
- print("我是女儿")
-
- def test(father):
- father.tell()
-
-
- if __name__ == '__main__':
- a = father()
- b = son()
- c = daughter()
- test(a)
- test(b)
- test(c)
我是父亲
我是儿子
我是女儿
在例子中通过tell()函数实现了父类引用指向子类实例,完成了一个函数的多种实现
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。