Python基础之day06-面向对象基础1
代码仓库地址: https://gitee.com/andox_yj/python
一、面向对象介绍
- 面向对象介绍:面向对象是一种软件开发的方法,使用类和对象来描述事物。
- 面向过程:根据业务逻辑从上到下写代码
- 面向对象:将数据与函数绑定到一起,进行封装,这样能够更快速的开发程序,减少了重复代码的重写过程
- 面向对象编程:是一种解决软件复用的设计和编程方法。 这种方法把软件系统中相近相似的操作逻辑和操作 应用数据、状态,以类的型式描述出来,以对象实例的形式在软件系统中复用,以达到提高软件开发效率的作用。
- 面向对象三大特性:
- 封装:把数据和行为(或功能)相结合,形成一个整体,隐藏实现细节,对外提供使用。
- 继承:一个类可以继承另外一个类的属性和方法,有单继承和多继承单继承指一个类只能有一个父类,多继承指一个类可以有多个父类
- 多态:多态依赖于继承,一个类的对象的引用,可以指向这个类的对象,也可以指向它的子类对象,在运行后才能确定具体是哪个对象,通过这种形式让程序有多种形态,称为多态
- 类介绍:
- 类(Class): 用来描述具有相同的属性和方法的对象的集合。它定义了该集合中每个对象所共有的属性和方法。对象是类的实例。
- 方法:类中定义的函数。
- 类属性:类变量在整个实例化的对象中是公用的。类变量定义在类中且在函数体之外。类变量通常不作为实例变量使用。
- 对象属性:仅属于当前对象的变量
- 数据成员:类变量或者实例变量用于处理类及其实例对象的相关的数据。
- 方法重写:如果从父类继承的方法不能满足子类的需求,可以对其进行改写,这个过程叫方法的覆盖(override),也称为方法的重写。
- 局部变量:定义在方法中的变量,只作用于当前实例的类。
- 实例变量:在类的声明中,属性是用变量来表示的,这种变量就称为实例变量,实例变量就是一个用 self 修饰的变量。
- 继承:即一个派生类(derived class)继承基类(base class)的字段和方法。继承也允许把一个派生类的对象作为一个基类对象对待。例如,有这样一个设计:一个Dog类型的对象派生自Animal类,这是模拟"是一个(is-a)"关系(例图,Dog是一个Animal)。
- 实例化:创建一个类的实例,类的具体对象。
- 对象(实例、成员):通过类定义的数据结构实例。对象包括两个数据成员(类变量和实例变量)和方法。
- 类与对象
- 类:用来描述具有相同的属性和方法的对象的集合。它定义了该集合中每个对象所共有的属性和方法。对象是类的实例。
- 对象:对象向对象编程的核心,在使用对象的过程中,为了将具有共同特征和行为的一组对象抽象定义,提出了另外一个新的概念——类
二、定义类及创建类对象
- 代码示例
""" 语法结构: # 定义一个类 class 类名: 类属性名=属性值 def 方法名(self): 代码... # 创建一个类对象 object = 类名() """ # 创建一个猫对象 class Cat: # 类属性 colour = 'black' # 方法 def eat(self): print('吃鱼') def drink(self): print('喝酸奶') # 创建猫类的对象 tom1 = Cat() # 创建第一只猫 # 获取类属性 print(tom1.colour) # black # 设置对象属性,并输出 tom1.age = 18 print(tom1.age) # 18 # 执对象方法 tom1.eat() # 第一只猫执行吃鱼的方法 tom1.drink() # 第一只猫执喝酸奶的方法 # 创建第二只猫 tom2 = Cat() # 获取类属性 print(tom2.colour) # black # 设置对象属性,并输出 tom2.age = 20 print(tom2.age) # 18 # 执对象方法 tom2.eat() # 第二只猫执行吃鱼的方法 tom2.drink() # 第二只猫执喝酸奶的方法
三、在类中通过self获取对象属性
- self 介绍:类中定义的所有方法,第一个参数都必须是 self,self表示当前类对象本身,既哪个对象调用的该方法,self就代表哪个对象。
- 代码示例
# 创建一个类 class Person: def study(self): print("我在学习{}".format(self.course)) # 创建第一个类对象 p1 = Person() p1.course = "编程" p1.study() # 我在学习编程 # 创建第二个类对象 p2 = Person() p2.course = "Python" p2.study() # 我在学习Python
四、__init__方法
- __init__方法介绍:
- __init__方法,在创建一个对象时默认被调用,不需要手动调用
- 在__init__(self)中的self参数,不需要开发者传递,python解释器会自动把当前的对象引用传递过去。
- 在__init__(self)方法里设置的对象属性,与 对象.属性名 = 属性值 的效果是一样的。
- 代码示例
# ################# 1、无参数的__init__方法,给对象绑定默认属性 #################### class Cat1: # 属性 def __init__(self): self.name = 'tom' self.age = 18 # 方法 def introduce(self): print('大家好,我是%s,我今年%s岁' % (self.name, self.age)) # 创建类对象时,不需要传递参数 cat1 = Cat1() # 输出对象属性 print(cat1.name) # tom print(cat1.age) # 18 # 使用对象方法 cat1.introduce() # 大家好,我是tom,我今年18岁 # ################# 2、有参数的__init__方法 #################### class Cat2: # 属性 def __init__(self, name, age): self.name = name self.age = age # 方法 def introduce(self): print('大家好,我是%s,我今年%s岁' % (self.name, self.age)) # 创建类对象时,需要传递参数 cat2 = Cat2('黑猫警长', 22) # 输出对象属性 print(cat2.name) # 黑猫警长 print(cat2.age) # 22 # 使用对象方法 cat2.introduce() # 大家好,我是黑猫警长,我今年22岁 # ################# 3、有参数的__init__方法,给参数设置默认值 #################### class Cat3: # 属性 def __init__(self, name="蓝猫", age=16, gender="男"): self.name = name self.age = age self.gender = gender # 方法 def introduce(self): print('大家好,我是%s,我今年%s岁,我是%s生' % (self.name, self.age, self.gender)) # 创建类对象,传递参数就用传递的,不传递就用默认的 cat3 = Cat3("灰猫", age=30) # 输出对象属性 print(cat3.name) # 灰猫 print(cat3.age) # 30 # 使用对象方法 cat3.introduce() # 大家好,我是灰猫,我今年30岁,我是男生
五、私有属性和私有方法
- 私有权限介绍:
- 在属性名或方法名 前面 加上两个下划线 __,就是私有属性或私有方法了,私有属性。
- 类的私有属性 和 私有方法,都不能通过对象直接访问,但是可以在本类内部访问;
- 私有属性 和 私有方法 往往用来处理类的内部事情,不通过对象处理,起到安全作用。
- 注意:私有化既在创建属性或者方法的时候,将名字修改为:
_类名 + __属性名/方法名
,如需访问,使用:对象._类名 + __属性名/__方法名
- 代码示例
""" 用法: 私有属性: 私有类属性:__变量名 = 值 私有对象属性:self.__变量名 = 值 私有方法: def __方法名(self): """ class Person: __name = "Andy_class" def __init__(self): # 私有属性 self.__name = 'Andy' # 私有方法 def __study(self): print("%s学习编程" % self.__name) # 对外访问私有属性的方法 加验证 def verify_get_name(self, password): if password == 123: # 私有属性,可以在类的内部使用 print(self.__name) else: print('密码验证失败') # 对外访问私有属性的方法 def get_name(self): print(self.__name) # 对外修改私有属性的方法 def set_name(self, new_name): self.__name = new_name # 对外调用私有方法的方法 加验证 def verify_get_study(self, password): if password == 123: # 私有方法,可以在类的内部使用 self.__study() else: print('密码验证失败') # 对外调用私有方法的方法 def get_study(self): # 私有方法,可以在类的内部使用 self.__study() person = Person() # 1.调用私有属性报错 # print(person.__name) # AttributeError: 'Person' object has no attribute '__name' # 2.调用私有方法报错 # person.__study() # AttributeError: 'Person' object has no attribute '__study' # 3.通过调用方法验证密码后查看私有属性,安全验证 person.verify_get_name(123) # Andy # 4.使用对外接口方法来查看私有属性 person.get_name() # Andy # 5.使用对外接口来设置私有属性 person.set_name("Andy_Change") person.get_name() # Andy_Change # 6.通过调用方法验证密码后调用私有方法,安全验证 person.verify_get_study(123) # Andy_Change学习编程 # 7.使用对外接口方法来查看私有属性 person.get_study() # Andy_Change学习编程 # 8.强制访问私有属性与私有方法:对象._类名 + __属性名/__方法名 print(person._Person__name) # Andy_Change person._Person__study() # Andy_Change学习编程 # 9.当对象属性与类属性重名时,会优先调用对象属性,如果想使用类属性,可以类名.类属性名 print(person._Person__name) # Andy_Change print(Person._Person__name) # Andy_class