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

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

文章目录

  • 一、面向对象之封装


  • 二、property


  • 三、面向对象之多态


  • 四、反射

    • 1.hasattr
    • 2.getattr
    • 3.setattr
    • 4.delattr



一、面向对象之封装

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


实质上就是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__)

欢迎分享,转载请注明来源:内存溢出

原文地址:https://54852.com/langs/567895.html

(0)
打赏 微信扫一扫微信扫一扫 支付宝扫一扫支付宝扫一扫
上一篇 2022-04-09
下一篇2022-04-09

发表评论

登录后才能评论

评论列表(0条)

    保存