面向对象:多态和封装、property

多态指的是一类事物有多种形态:python天生支持多态
例如:
class Wechat:
    def pay(self,money):
        print('支付%s钱'%money)

class Alipay:
    def pay(self,money):
        print('支付%s钱'%money)

class Applepay:
    def pay(self,money):
        print('支付%s钱'%money)

# python中直接调用传参给payment即可调用上方所有类的方法
def pay(payment,maoney):
    payment.pay(maoney)

多态:在java中,由于是强数据类型,调用这些类需要给他们创建一个父类,意思就是允许将子类类型的指针赋值给父类类型的指针
class Payment:#父类
    pass

class Wechat(Payment):
    def pay(self,money):
        print('支付%s钱'%money)

class Alipay(Payment):
    def pay(self,money):
        print('支付%s钱'%money)

class Applepay(Payment):
    def pay(self,money):
        print('支付%s钱'%money)
        
def pay(Payment payment,int maoney):#这里的Payment是父类Payment,在java中只有这样才能使用到子类Wechat等
    payment.pay(maoney)

 

封装:

  广义:面向对象的封装是对代码的保护,面向对象的思想本身就是一种,只让自己的对象能调用自己类中的方法就是一种封装

  狭义:是面向对象的三大特性之一,属性和方法都藏起来,不让你能在外部调用,让你看不见

使用方法:名字前面加双下划线

class Person:
    def __init__(self,name,money):
        self.name = name
        self.__money = money        #被封装,可以在类里使用
    def __drawing(self):            #被封装,可以在类里使用
        print('我画画很好,但是保密')
    def func(self):
        self.__drawing()            #调用被封装的方法
        print(self.__money)         #调用被封装的属性

aike = Person('aike',1000)
print(aike.name)
print(aike.__dict__)#被封装的属性以类名加属性的名字存在字典当中
print(aike._Person__money)#用key可以查看被封装的值,但是不建议这样使用
aike.func()#调用正常方法
print(aike.money)#被封装起来,无法调用,会报错
aike.__drawing#被封装起来,无法调用,会报错

 会用到封装的场景:

1.隐藏起一个属性 不想让类的外部调用

2.我想保护这个属性,不想让属性随意被改变

3.我想保护这个属性,不被子类继承

class Person:
    def __init__(self,name,money):
        self.__name = name
        self.__money = money
    def get_name(self):
        return self.__name
    def set_name(self,new_name):
        if type(new_name) is str and new_name.isdigit() == False:
            self.__name = new_name
            return self.__name

class Func(Person):
    print(Person.__name) #报错,父类被封装的属性或者方法不能被子类继承

aike = Person('aike',1000)
print(aike.get_name())
print(aike.set_name('艾克'))
print(aike.get_name())

 

property、setter、deleter:不改变对象调用属性名的方式(obj.name),实现被封装属性的查看、修改、删除

#以上方例子为例
class Person:
    def __init__(self,name,money):
        self.__name = name
        self.__money = money
    @property #查看
    def name(self):
        return self.__name
    @name.setter #修改
    def name(self,new_name):
        self.__name = new_name
        return self.__name
    @name.deleter #删除
    def name(self):
        del self.name
aike = Person('aike',1000)
print(aike.name)
aike.name = '艾克'
print(aike.name)
# del aike.name 
posted @ 2019-09-05 19:29  aikell  阅读(166)  评论(0编辑  收藏  举报