Python中类的继承,封装和多态

1、封装

python中的类可以封装:属性,方法。

1.1属性的封装:

将属性私有化,并且定义共有方法set和get。

   #当我们对于一个类进行属性封装时,需要定义私有属性:
   class Student:
      def __init__(self,name,age):
          self.__name = name
          self.__age = age
   
   #像这样定义私有化属性后,外界就无法通过普通的'.'来访问
   s = Studnet('zs',12)
   s.name # 报错
   s.__name # 报错

在这里插入图片描述

	# 这时我们需要get和set方法来实现获取和赋值
	# get获取私有属性的值
	def get_name(self,name):
		return self.__name
		
	def get_name(self,age):
		return self.__age
		
	name = s.get_name()
	age = s.get_age()
	print(name,age)
	
	
	# set设置私有属性的值
	def set_name(self,name):
		self.__name = name
		
	def set_age(self,age):
		self.__age =age
		
	# 调用类中的这个方法,就可以赋值
	s.set_name(name)
	s.set_age(age)
	
	

但是问题来了,如果我只是定义了私有变量那有什么用呢 ?实际上,我们可以利用理由变量来进行一些限制操作

	# 假设我们在__init__中定义了一个self.__login=False 来判断是否登录
	# 那么这个get方法就可以限制未登录就不可以拿到name的值
	def get_name(self):
		if self.__login:
			return self.__name
		else 
			return "未登陆"
	
	# 这个set方法就可以增加输入条件
	def set_name(self,name):
		if len(name) > 6:
			self.__name = name
		else:
			return "姓名不符合要求"

可是,对象存在动态赋值这么一说,即使这个类没有name属性,也可以通过s.name = ‘…’进行赋值,我们不希望对象被动态赋值,每一个对象只能对私有属性赋值,那么就需要__slots__
在这里插入图片描述

	# 在__init__之前定义__slots__
	__slots__ = ['__name','__age']
	
	def __init__(self,name,age):
		....

这个__slots__是一个列表,写上私有属性,这样每个对象只能用这些属性了,不能动态赋值

私有化的作用:

1、隐藏了属性,私有属性只能在类中使用
2、对私有属性的取值和赋值起到了一定的限制作用
3、通过set方法限制赋值,get方法限制取值

1.2 @property与@属性名.setter装饰器

@property装饰器:装饰get函数,可以直接利用 s.name 拿到对象中私有属性的值
@属性名.setter装饰器(属性名是get函数的函数名): 装饰set函数,可直接s.name=‘zhaowu’,设置对象中私有属性的值

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

在这里插入图片描述

虽说两个函数的名称一样,但是加了装饰器之后,被@property装饰的是get函数,@属性名.setter装饰的就是set函数。而且在没有__slots__的情况下,动态赋值时的参数名就不能与@property装饰的函数名相同,否则会进行@property的赋值操作

2、继承

简单来说就是子类继承父类,父类中有共有的一些属性和方法,比如说:老师类,学生类,都有吃,喝,玩等方法,都有姓名,年龄等属性,我们可以写一个父类,父类中写入吃喝玩,姓名年龄。这样每个子类只要继承父类就可以用有这些属性和方法。而他的好处就是能够使代码更加简练,减少冗余,提高可读性等等。python3 默认继承 object

	class Person:
	    def __init__(self,name,age):
	        self.name = name
	        self.age = age
	
	    def eat(self):
	        return self.name+'正在吃'
	
	    def play(self):
	        return self.name+'正在玩'
	
	class Student(Person):      # 继承父类
	    pass
	
	class Teacher(Person):      # 继承父类
	    pass
	
	s = Student('zs',12)
	print(s.eat())        # zs正在吃
	print(s.play())       # zs正在玩

需要注意的是,每个子类继承的是父类非私有化属性,共有属性可以访问,私有属性就不可以访问

2.1 @classmethod 类方法

通常,我们无法通过 类名.方法名的形式使用类中的方法,一般是 对象.方法名 去使用,但是我们可以通过@classmethod 去装饰这个方法,这样,就可以直接通过 类名.方法名 去使用

	class Person:
	    name = '小明'
	    age = 23
	
	    @classmethod
	    def eat(cls):      # cls 是类名
        return cls.name+'正在吃'

	print(Student.eat())   # 小明正在吃
2.2 @staticmethod 静态方法

静态方法不依赖cls,也不依赖self,他只是一个方法,通过 类名.属性 访问类属性

	class Person:
	    name = '小明'
	    age = 23
	
	    @staticmethod       # 静态方法不依赖与任何参数
	    def eat():      
        return Student.name+'正在吃'    # 只能通过类名访问

	print(Student.eat())   # 小明正在吃
	s = Student()
	print(s.eat())   # 也可以使用
类方法与静态方法都可以被对象或类调用,两者也可以相互调用,类方法不能访问对象属性,它只与类打交道,不与对象有关联

3、多态

多态与继承有关系,多态指的是继承时,传过来一个对象,这个对象可以是父类实例化的任何的对象

具体可以参照鸭子模型~

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值