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是弱数据类天生支持多态