python基础知识(八)面向对象----(三)

(八)面向对象----(三)

面向对象的三大特性----多态,封装

目录

python基础知识(八)面向对象----(三)

面向对象的三大特性----多态,封装

8.1多态

8.2封装

8.3 property,classmethod,staticmethod


8.1多态

多态:同一事物的多种形态。水果:苹果,草莓,榴莲

多态性:向不同的对象调用相同的函数名,每个对象都用自己函数方法实现调用。水果的味道:苹果的味道,草莓的味道,榴莲的味道

from abc import abstractmethod,ABCMeta
class Fruit(metaclass=ABCMeta):
    @abstractmethod
    def taste(self):pass
        
class apple(Fruit):
    def taste(self):
        print('苹果味') 
class banana(Fruit):
    def taste(self):
        print('香蕉味')
apple = apple()
banana = banana()
apple.taste()
banana.taste()

在程序设计中,鸭子类型(英语:duck typing)是动态类型的一种风格

“当看到一只鸟走起来像鸭子、游泳起来像鸭子、叫起来也像鸭子,那么这只鸟就可以被称为鸭子。”

python 动态强类型的语言

                不崇尚根据继承所得来的相似

                我只是自己实现我自己的代码就可以了。

                如果两个类刚好相似,并不产生父类的子类的兄弟关系,而是鸭子类型

优点 : 松耦合 每个相似的类之间都没有影响

缺点 : 太随意了,只能靠自觉

8.2封装

python中所有的私有,都是在变量的左边加上双下划线的方法将其属性隐藏

所有的私有的 都不能在类的外部使用

a.对象的私有属性

b.类中的私有方法  

c.类中的静态私有属性

class Dog:
    __key = 123  # 私有静态属性
    def __init__(self,name,kind):
        self.name = name
        self.__kind = kind   # 私有属性

    def __get_kind(self):         # 私有方法
        return self.__kind   #只要在类的内部使用私有属性,就会自动的带上_类名

    def login(self):          # 正常的方法调用私有的方法
        self.__get_kind()

yuki = Dog('yuki','bigdog')
print(yuki._Dog__kind)   # _类名__属性名,外部可调用,但不提倡
print(yuki.get_kind())   #取不到
#有一个房子
class Room:
    def __init__(self,name,length,width):
        self.__name = name
        self.__length = length
        self.__width = width
    def area(self):
        return self.__length * self.__width
leo = Room('leo',10,10)
print(leo.area())
#100

修改房子名字

class Room:
    def __init__(self,name,length,width):
        self.__name = name
        self.__length = length
        self.__width = width
    def get(self):
        return set._name
    def set(self, newname):
        if type(newname) is str and newname.isdigit() == False:
            self.__name = newname
        else:
            print('不合法的姓名')
    def area(self):
        return self.__length * self.__width
leo = Room('leo',10,10)
leo.name = 'aaaaa'
print(leo.name)
#aaaaa

会用到私有的这个概念的场景:

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

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

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

8.3 property,classmethod,staticmethod

相关链接:https://blog.csdn.net/zeroooorez/article/details/89577312

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值