1.封装:
1,在面向对象中,封装指的是一种安全机制,不让外界修改或者直接操作,将属性私有化;
如果要访问属性,提供公开的方法(getter,setter)
2. python的类如何私有化成员(属性,方法)
原有的属性或者方法名前加__ ==>两个_ _
封装后的属性或者方法,只能在类的内部调用!!!
3,python为我们提供了三种不同的封装方式
1,标准写法:封装属性,提供get和set方法
2,propterty全局函数,封装get和set方法,在返回一个新的属性
3,@propterty和@名称.setter实现
# 求圆的周长和面积
class Circle(object):
    def __init__(self, r, pi):
        self.r = r
        self.PI = pi
    def get_area(self):
        return self.r ** 2 * self.PI
    def get_zc(self):
        return 2 * self.r * self.PI
class Juxing(object):
    def __init__(self, width, height):
        self.__width = width
        self.__height = height
    def get_width(self):    #get封装方法相当于钥匙,限制外界访问
        return self.__width
    def set_width(self, width):     #set方法相当于设置钥匙,有了set,外界可以设置值
        self.__width = width
    def area(self):
        #封装后的属性和方法,只能在类内部使用
        self.__my_speak()
        return (self.__width + self.__height) * 2
    def zc(self):
        self.__my_speak()
        return self.__height * self.__width
    def __my_speak(self):
        #该方法只能在类内部只用,所以私有化这个方法,外界无法访问该方法
        print("我是一个矩形,欢迎使用我")
if __name__ == '__main__':
    # c1 = Circle(2, 3.14)
    # print(c1.get_area())
    # juxing = Juxing(2, 3)
    # print(juxing.area(), juxing.zc())
    w = float(input("请输入矩形的宽:"))
    h = float(input("请输入矩形的高:"))
    a = Juxing(w, h)
    print(f"该矩形的面积是{a.area()},周长为{a.zc()}")
    # 修改宽--set方法修改封装后的属性
    a.set_width(w * 2)
    print(f"该矩形的面积是{a.area()},周长为{a.zc()}")
 
运行结果:
请输入矩形的宽:5
请输入矩形的高:5
我是一个矩形,欢迎使用我
我是一个矩形,欢迎使用我
该矩形的面积是20.0,周长为25.0
我是一个矩形,欢迎使用我
我是一个矩形,欢迎使用我
该矩形的面积是30.0,周长为50.0
 
 
2.继承:子类会继承父类的一些属性或者方法
class 子类(父类[,父类2,父类3]) :
注意:子类继承父类时,不是所有的属性和方法都会继承;是继承能够继承的类成员
注意:继承主要解决的是代码复用问题,将多个子类需要用的方法,可以定义在父类中
class Man(object):
    def __init__(self):
        self.__name = "ma"
        self.company = "alibb"
        self.money = 10000000
    def speak(self):
        print("我对钱不感兴趣")
        print("我最后悔的一件事创建了albb")
    def __talk(self):
        print("这个是封装,是私有方法,我不想告诉别人")
class Son(Man):
    def __init__(self):
        #super表示父类
        super().__init__()
        self.name = "我叫儿子"
        self.age = 18
if __name__ == '__main__':
    s1 = Son()
    print(s1.money)
    print(s1.company)
    s1.speak()
 
运行结果:
10000000
alibb
我对钱不感兴趣
我最后悔的一件事创建了albb 

3,多态
一个事务有多种状态,
在继承的基础上,父类引用指向子类实例对象的现象
python是弱数据类天生支持多态


















