python基础——面向对象封装、多态、反射、property


一、面向对象之封装

在类定义时对变量名(方法名)之前加上_ _来进行封装,封装可以隐藏该变量,使对变量的直接调用失效,让对该变量的调用只能通过内部提供接口来实现,封装可以让代码被隔离起来,从外部调用使用接口才能改变封装的对象。实质上就是python将 _ _开头的变量名(方法名)的名称空间改变为了 _ 类名 _ _变量名(方法名)。

class A(object):
    name = "bbc"
    __money = 28

a = A()
print(a.name)
print(a.__money)

在这里插入图片描述
此时无法直接调用__money变量

class A(object):
    name = "bbc"
    __money = 28

    def get_money(self):
        return self.__money

a = A()
print(a.get_money()) # 通过类中的接口获取
print(a._A__money) # 按照封装的语法获取

此时通过类中编写的接口可以直接使用,通过封装语法也能调用,但一般会遵从接口调用的形式
在这里插入图片描述

二、property

@property可以将对应方法伪装为变量

class Change(object):
    def __init__(self, num1, num2):
        self.num1 = num1
        self.num2 = num2

    @property
    def division(self):
        num1 = int(self.num1)
        num2 = int(self.num2)
        return "%s除以%s,商%s,余%s"%(num1, num2, num1/num2, num1%num2)

change = Change(5,2)
print(change.division)

三、面向对象之多态

一个类的多种形态

class Subject(object):

    def get_teacher(self):
        pass

class Matchs(Subject):

    def get_teacher(self):
        return "bbc"

class Chinese(Subject):

    def get_teacher(self):
        return "kkx"

matchs = Matchs()
chinese = Chinese()
print(matchs.get_teacher())
print(chinese.get_teacher())

在这里插入图片描述
同一种事物的不同形态换成代码就是同一个类被其他类继承后其中的变量、函数被重写,就是面向对象的多态。面向对象的多态性需要开发者自己遵守,不过python提供了强制的措施来实现,但一般是不推荐这么做的。

import abc
class Subject(object, metaclass=abc.ABCMeta): # 添加上metaclass=abc.ABCMeta

    @abc.abstractmethod # 使用@abc.abstractmethod让子类必须实现该函数
    def get_teacher(self):
        pass

class Matchs(Subject):

    def get_teacher(self):
        return "bbc"

class Chinese(Subject):

    def get_teacher(self):
        return "kkx"

matchs = Matchs()
chinese = Chinese()
print(matchs.get_teacher())
print(chinese.get_teacher())

四、反射

反射就是通过字符串的形式去对象(模块)中操作(查找/获取/删除/添加)成员

1.hasattr

判断对象中是否有这个方法或变量

class Assion(object):
    name = "bbc"

    def get_as(self):
        print("from Assion in get_as")

print(Assion.__dict__)
print(hasattr(Assion, "get_as"))

在这里插入图片描述

2.getattr

获取对象中的方法或变量的内存地址

class Assion(object):
    name = "bbc"

    def get_as(self):
        print("from Assion in get_as")

print(Assion.__dict__)
print(getattr(Assion, "name"))

在这里插入图片描述

3.setattr

为对象添加变量或方法

class Assion(object):
    name = "bbc"

    def get_as(self):
        print("from Assion in get_as")

print(Assion.__dict__)
setattr(Assion, "age", 18)
print(Assion.__dict__)

在这里插入图片描述

4.delattr

删除对象中的变量。注意:不能用于删除方法

class Assion(object):
    name = "bbc"

    def get_as(self):
        print("from Assion in get_as")

print(Assion.__dict__)
delattr(Assion, "name")
print(Assion.__dict__)

在这里插入图片描述

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值