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 = rself.PI = pidef get_area(self):return self.r ** 2 * self.PIdef get_zc(self):return 2 * self.r * self.PIclass Juxing(object):def __init__(self, width, height):self.__width = widthself.__height = heightdef get_width(self): #get封装方法相当于钥匙,限制外界访问return self.__widthdef set_width(self, width): #set方法相当于设置钥匙,有了set,外界可以设置值self.__width = widthdef area(self):#封装后的属性和方法,只能在类内部使用self.__my_speak()return (self.__width + self.__height) * 2def zc(self):self.__my_speak()return self.__height * self.__widthdef __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 = 10000000def speak(self):print("我对钱不感兴趣")print("我最后悔的一件事创建了albb")def __talk(self):print("这个是封装,是私有方法,我不想告诉别人")class Son(Man):def __init__(self):#super表示父类super().__init__()self.name = "我叫儿子"self.age = 18if __name__ == '__main__':s1 = Son()print(s1.money)print(s1.company)s1.speak()
运行结果:
10000000
alibb
我对钱不感兴趣
我最后悔的一件事创建了albb
3,多态
一个事务有多种状态,
在继承的基础上,父类引用指向子类实例对象的现象
python是弱数据类天生支持多态