Python 入门 之 面向对象(封装&继承&多态)

Python 入门 到 精通 (六)

本篇文章重点讲解Python的面向对象,包括Python中如何定义类、对象、封装、继承、多态等
在这里插入图片描述

封装

封装,是给类中的属性提供get、set方法

			语法格式:
					
					def  set方法(self):
					
					    代码块
					
					def  get方法(self):
					
					    代码块
			    
			eg:
			
					def  setName(self,name):
					
					    self.__name=name
					
					def  getName(self):
					
					    return self.__name

get、set装饰器

get方法装饰器:@property

set方法装饰器:@属性名.setter

调用:直接通过对象.属性名即可

注意:get方法修饰器必须写到set方法修饰器前面

			eg:
			
			@property
			
			def name(self):
			
			    return self.__name
			
			
			
			@name.setter
			
			def name(self,name):
			
			    self.__name=name

类 和 对象

定义类:

			语法
			
					class  类名 (父类):
					
					            代码块
					
			注意:()可有可无
			
			eg:
					
					class  Person:
					
					    #这是一个类

创建对象(实例):

注意:Java语言在实例化对象是,采用new关键字,而Python语言不需要。

			语法
			
					对象名=类名()
			
			
			eg:
			
					person=Person()

调用类属性和方法:

			对象名.属性
			
			对象名.方法()

isinstance() 语法:

isinstance() 是检测一个对象是否是一个类的实例

			语法格式:
					
					isinstance(对象,类),结果返回True和False
			
			eg:
			
					isinstance(person,Person),结果为True

self

self 指的是调用该函数的对象

函数中默认参数self,该默认的参数self指的是调用该函数的对象

注意:

self 和调用函数对象的内存地址一致

如果是多个对象,调用同一个函数,self地址不一致


属性

属性:分为类属性和对象属性

类属性

可以通过类名或者对象访问,写在类里面,语法:变量名=变量值

			class  Person:
			
			        name="张三"   # name是类属性

修改类属性:

只能通过类修改,不能通过对象修改,语法:类名.变量名=变量

注意:如果通过对象对属性进行重新赋值,实际上是给该对象又重新定义了一个属性名一样的变量!!!


对象属性

			p1=Person()
			
			p1.name="张三"  # name是对象属性

添加对象属性:

  • 类外面添加对象属性,语法:对象名.属性名=值,注意:该方式添加的属性,只能属于该对象

  • 类里面添加对象属性,语法:变量名=变量值,注意:该方式添加的属性,属于所有类对象

  • __init__() 方法中添加对象属性,语法:self.属性名=值,用在__init__()初始化方法中

获取对象属性:

  • 类外面获取对象属性,语法:对象名.属性名

  • 类里面获取对象属性,语法:self.属性名,用在函数中

类属性和对象属性的区别?

  • 类属性直接通过类名就可以调用,比如:

      		Person.name
    
  • 对象属性必须通过对象名调用,比如:

      		p1.name
    

属性修饰符:私有属性、公共属性

公共属性:

没有任何修饰符,该类型的属性可以被任意一个对象所调用

			比如:
			
			name="张三"

私有属性:

不能通过对象调用,也不能通过类名调用,只能在本类中调用,类似Java语言中的private,

私有属性如果想要在外部调用,则需提供get和set方法,私有属性通过双下划线修饰__

			eg:
			
			__name="张三"   #这是一个私有属性

私有属性和私有方法(在这里我就一起讲了哈)

  • 设置私有属性和方法:

    在属性名和方法名前面加两个下划线__

    定义为私有属性和私有方法,不能被子类继承

  • 获取和修改私有属性的值

    获取,定义getXXX()

    修改,定义setXXX()


方法

对象方法:

定义在类中的函数被称为方法,所有的实例都可以访问

注意:对象方法,必须默认传递一个参数self,类似java中的this关键字

调用:只能通过对象调用

			eg:
			
					class Person:
					
					     def  eat(self):
					
					            代码块
			
			#调用
			
					person=Person()
					
					person.eat()

类方法:

@classmethod 修饰的方法,被称为类方法

参数:cls

调用:可以通过类调用

			eg:
			
					@classmethod
					
					def sleep(cls):
					
					        print("睡觉")
			
			#调用
			
					Person.sleep()

静态方法:

@staticmethod 修饰的方法,被称为静态方法

参数:无参数

调用:可以通过类和对象调用

			@staticmethod
			
			def playDD():
			
			    print("打豆豆")
			
			#调用
			
			Person.playDD() #类名调用
			
			person.playDD() #对象调用

构造方法:

构造方法 是以双下划线__开头,双下划线__结尾,方法名叫init,构造方法不需要自己调用,在实体化对象时调用,和Java中的构造方法一样

			语法格式:
					
					def  __init__(self,参数):
					
					    代码块
					
			eg:
			
					def  __init__(self,name,age):
					
					        self.__name=name
					
					        self.__age=age

魔法方法:

__XX__() 函数叫做魔法方法,指的是具有特殊功能的函数

__init__() 初始化对象,在创建一个对象时默认被调用,不需要手动调用,带参数,类似于Java语言中的构造方法

__str__() print输出对象时,默认打印的是对象在内存中的地址,如果类中定义__str__方法,则会打印__str__方法中的内容,类似于Java语言中的toString() 方法

封装 - 代码体现:

				"""
				类和对象
				"""
				# 定义类
				
				
				class Person(object):
				    # 定义属性【类属性】:可以用类或者对象调用
				    name = "张三"
				
				    __cardPass = "775885"
				
				    # 给私有属性提供get和set方法
				    def setCardPass(self, cardPass):
				        self.__cardPass = cardPass
				
				    def getCardPass(self):
				        return self.__cardPass
				
				    # 类方法
				    @classmethod
				    def sleep(cls):
				        print(f"{cls.name}正在睡觉")
				
				    # 静态方法
				    @staticmethod
				    def playDD():
				        print("正在打豆豆")
				
				    # 构造方法,初始化方法
				    def __init__(self, age, gender):
				        # 在初始化方法中给对象添加属性
				        self.age = age
				        self.gender = gender
				
				    # 定义方法
				    def eat(self):
				        print(f"{self.name}吃月饼")
				        print(self)
				
				    # 魔方方法,类似java中的toString()方法
				    def __str__(self):
				        return f"{self.name}, {self.age}, {self.gender}"
				
				
				# 实例化对象
				person = Person(11, "男")
				person2 = Person(22, "女")
				# print(person)
				print(person2)
				# 调用属性【类属性】
				# print(person.name)
				# print(Person.name)
				
				# 修改类属性的值
				# person.name = "李四"  # 注意:该种方式不能修改类属性的值
				# Person.name = "李四"
				# print(person.name)
				# print(Person.name)
				
				# 调用函数
				# person.eat()
				# person2.eat()
				
				# 添加对象属性
				# 01.类外面添加:该属性只能被当前对象使用
				# person.age=22
				# print(person.age)
				# print(person2.age)
				
				# person.eat()
				
				#调用不来
				# print(person.__cardPass)
				# print(person2.__cardPass)
				
				# person.setCardPass("123456")
				# print(person.getCardPass())
				
				# 调用类方法
				# Person.sleep()
				# person.sleep()
				
				# 调用静态方法
				# Person.playDD()
				# person.playDD()


继承

继承语法:

  1. 单继承:

    父类,class 父类(object) (在python中,所有类默认继承object类)

    子类,class 子类(父类)

  2. 多继承:

    子类,class 子类(父类1,父类2)

    通过语法格式可以看出Python语言支持多继承,Java语言只支持单继承

    查看一个类的继承关系使用:类名.__bases__属性

    多继承特点:一层一层获取,先找自己的类中,再从继承关系中找

    注意:如果一个类继承多个父类,优先继承父类1的同名属性和方法

查看一个类的继承关系,类.__mro__

issubclass()

			issubclass()方法作用:
			
			检测一个类是否是另外一个类的子类
			
			语法:
			
			issubclass(子类,父类)

方法重写

像Java语言一样,Python语言也同样支持方法的重写 override

注意:如果子类重写了父类的同名属性和方法,则会调用子类中的同名属性和方法

子类调用父类的同名属性和方法,在子类的同名方法中调用,语法:父类.方法(self);super(),调用父类方法,super().方法()

继承 - 代码体现:

				"""
				继承
				"""
				# 定义父类
				
				
				class Father(object):
				
				    money = 2222.22
				
				    def cook(self):
				        print("会炒菜")
				
				    def eat(self):
				        print("会吃")
				
				
				class Mother(object):
				
				    money = 22222.22
				
				    def cook(self):
				        print("会煮面条")
				
				    def playMJ(self):
				        print("打麻将")
				
				
				class Son(Mother, Father):
				    money = 22.22
				
				    def cook(self):
				        # 调用父类的cook方法
				        # 01
				        # Father.cook(self)
				        # Mother.cook(self)
				
				        # 02
				        super().cook()
				        print("煮泡面")
				
				
				son = Son()
				print(son.money)
				son.cook()
				# son.eat()
				# son.playMJ()
				
				# 查看类的继承关系
				# print(Son.__mro__)


多态

多态 的概念,和Java中的概念是一样的。

多态是一种使用对象的方式,子类重写父类方法,调用不同子类对象的相同父类方法,可以产生不同的执行效果。

步骤:

  1. 定义父类,提供父类方法

  2. 定义子类,重写父类方法

  3. 传递子类对象给调用者,返回不同的结果

     		class Person:
     		
     		def __init__(self,name):
     		
     		    self.__name=name
     		
     		
     		
     		@property
     		
     		def name(self):
     		
     		    return self.__name
     		
     		@name.setter
     		
     		def name(self,name):
     		
     		    self.__name=name
     		
     		
     		
     		class Boy:
     		
     		def __init__(self,name):
     		
     		    self.__name=name
     		
     		
     		
     		@property
     		
     		def name(self):
     		
     		    return self.__name
     		
     		@name.setter
     		
     		def name(self,name):
     		
     		    self.__name=name
     		
     		
     		
     		class Girl:
     		
     		    pass
     		
     		
     		
     		def eat(obj):
     		
     		    print("%s正在吃饭"%obj.name)
     		
     		p=Person("战三")
     		
     		b=Boy("小孩子")
     		
     		g=Girl()
     		
     		eat(g),参数p、b都没有问题,但是g就会有问题
    

多态 - 代码体现:

				"""
				多态
				水:
				气体:
				液体:
				固体:
				"""
				
				
				class Water(object):
				    def use(self):
				        pass
				
				
				class Gas(Water):
				    def use(self):
				        print("这是气体的水,可以用来蒸饺子")
				
				
				class Liquid(Water):
				    def use(self):
				        print("这是液体的水,可以用来煮饺子")
				
				
				class Solid(Water):
				    def use(self):
				        print("这是固体的水,可以用来冻饺子")
				
				
				class Person(object):
				    def cook(self, water):
				        water.use()
				
				person = Person()
				gas = Gas()
				liquid = Liquid()
				solid = Solid()
				person.cook(solid)

  • 4
    点赞
  • 5
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值