Python 面向对象
-
1.面向对象编程
面向对象编程(Object Oriented Programming,简称:OOP )是一种解决软件复用的设计和编程方法,就是根据现实社会中的事物,抽象出事物的属性和功能,后然将抽象出来的属性和功能封装成对象的属性和方法,在软件中通过复用对象实例提高软件的开发效率 ,很多高级编程语言都遵循面向对象的编程方法。
-
2.类和对象
-
类:是一类事物的抽象,定义了一类事物的属性和行为
- 类的构成:类名、属性、方法
- 定义:
class 类名: def 方法名(self[,参数列表]): 方法体 ...... 注意事项: 1.定义类时,使用class关键字声明这是一个类 2.类名的命名规则:通常按照约定的“大驼峰”命名法。例:class ElectricCar 电动车类 3.定义方法时,方法的第一个参数默认为self,表示对象自身 4.通过对象调用方法时,不需要在方法中传入self参数,python解释器会自动传入
class Cat: def eat(self): print("吃鱼。。。") def drink(self): print("喝水。。。") def run(self): print("跳舞。。。")
-
对象:是通过类创建的一个具体事物,具有状态和行为,可以做具体事情。
- 创建对象的过程:是在内存中开辟一块区域存储这个对象,这块内存区域有它的对应内存地址,通过内存地址就能找到这块区域存储的这个对象。
- 对象的引用:就是把存储这个对象的内存地址告诉了变量,这个变量就指向了内存中的这个对象,通过这个变量就可以找到它所指的这个对象,所以这个变量叫这个对象的引用。
# 根据Cat类创建对象 xiaohe=Cat() #调用对象的方法 xiaohe.eat() xiaohe.drink() xiaohe.run() #对比一个类创建多对象是否相同 xiaobai=Cat() #id(对象)可以获取对象的内存地址 print("xiaohe的id:{}".format(id(xiaohe))) print("xiaobai的id:{}".format(id(xiaobai)))
-
类与对象的关系:类相当于创建对象的基础条件,根据类可以创建多个对象。
-
-
3.
__init__
构造方法-
构造方法作用:是在创建一个类的对象时,对对象进行初始化操作。
-
python中类的构造方法名称是
__init__
。定义类时,没有显示定义__init__
构造方法,创建对象时会自动调默认没有参数的__init__
构造方法- 无参构造方法
class Cat: #无参构造方法 def __init__(self): print("初始化对象。。。") def eat(self): print("吃鱼。。。") def drink(self): print("喝水。。。") def run(self): print("跳舞。。。") # 创建对象 xiaohe=Cat() #调用对象的方法 xiaohe.eat() xiaohe.drink() xiaohe.run()
- 有参构造方法
class Cat: #有参构造方法 def __init__(self,sex,age): print("开始初始化对象。。。") self.sex=sex self.age=age print("结束初始化对象。。。") def eat(self): print("吃鱼。。。") def drink(self): print("喝水。。。") def run(self): print("跳舞。。。") # 创建对象 xiaohe=Cat("男",1) print("xiaohe的性别:{},年龄:{}".format(xiaohe.sex,xiaohe.age))
-
-
4.访问权限
python中类的属性和方法的访问权限不需要任何关键字修饰,是通过属性或者方法名前加两个下划线区分:
- 私有访问权限:属性或者方法名前加两个下划线,只能在类内部方法。例:
__name
变量,__eat()
方法 - 公共访问权限:不需要在属性或者方法名前加两个下划线,可以在外部访问。例:
name
变量,eat()
方法
class Cat: #有参构造方法 def __init__(self,sex): print("开始初始化对象。。。") self.sex=sex self.__age=age #私有属性 print("结束初始化对象。。。") def eat(self): print("吃鱼。。。") def drink(self): print("喝水。。。") def __run(self): print("跳舞。。。") def get_info(self): #调用私有属性和方法 print("年龄:{}".format(self.__age)) print("run方法:",self.__run()) # 创建对象 xiaohe=Cat("男",1) xiaohe.get_info()
- 私有访问权限:属性或者方法名前加两个下划线,只能在类内部方法。例:
-
5.继承
面向对象编程的好处之一是代码重用,通过继承机制可以很好的实现代码重用。
-
单继承:就是子类只继承一个父类
- 格式:
class 子类名(父类名):
- 特点:子类只会继承父类的非私有属性和非私有方法
#定义动物类 class Animal: def eat(self): print("吃。。。") def drink(self): print("喝。。。") def run(self): print("运动。。。") #定义子类 class Cat(Animal): #猫除了继承父类属性好行为,还会捉老鼠行为 def catch(self): print("捉老鼠。。。") # 创建对象 xiaohe=Cat() #调用对象的方法 xiaohe.eat() xiaohe.drink() xiaohe.run() xiaohe.catch()
-
super函数
-
子类调用父类方法的方式:
父类名.方法名(self[,参数列表])
:在调父类方法时,需要传入self参数,这个self是子类而不是父类的实例对象
class Cat(Animal): #猫除了继承父类属性好行为,还会捉老鼠行为 def catch(self): print("捉老鼠。。。") #定义子类 class BlackCat(Cat): #猫除了继承父类属性好行为,还会捉老鼠行为 def catch(self): Cat.catch(self) xiaohe=BlackCat() xiaohe.catch()
super.方法名
class Cat(Animal): #猫除了继承父类属性好行为,还会捉老鼠行为 def catch(self): print("捉老鼠。。。") #定义子类 class BlackCat(Cat): #猫除了继承父类属性好行为,还会捉老鼠行为 def catch(self): super.catch() xiaohe=BlackCat() xiaohe.catch()
-
-
重写
- 就是 在子类中定义与父类同名的方法。子类重写父类后调用时,只会调用子类中重写的方法
#定义动物类 class Animal: def eat(self): print("吃。。。") def drink(self): print("喝。。。") def run(self): print("运动。。。") class Cat(Animal): #猫除了继承父类属性好行为,还会捉老鼠行为 def run(self): print("跳舞。。。") xiaohe=Cat() xiaohe.eat() xiaohe.drink() xiaohe.run()
-
多继承
-
是一个子类可以继承多个父类
-
格式:
class 子类名(父类1,父类2,父类3,...):
class God: def change(self): print("百宝箱变东西。。。") class Cat: def eat(self): print("吃铜锣烧。。。") class Doraemon(God,Cat): def speak(self): print("说人话") a = Doraemon() a.change() a.eat() a.speak()
注:为了提高代码的可读性,多继承中,多个父类内尽量不要定义相同名称的方法
-
-
- 当才华还配不上野心,就静下来学习
- blog地址:hangzhi.site