Python基础第十三节—面向对象(中)
作者:互联网
文章目录
一、封装
封装是面向对象的三大特性之一,为了安全简化的编程,我们将抽象得到的数据和行为(或功能)相结合,形成一个有机的整体(即类);封装的目的是增强安全性和简化编程,使用者不必了解具体的实现细节,而只是要通过外部接口,一特定的访问权限来使用类的成员。
封装可以为属性和方法添加私有权限,使外界无法访问这个属性或方法,但这不是绝对的,就像外挂一样,我们能只能做到防止但做不到杜绝,所以私有属性或方法只是防君子但不防小人,私有属性(方法)在类外部无法使用,但可以在内部使用
# 在类中,在属性或方法的前面加上两个下划线,就称为私有属性(方法)
class Student:
# 初始化参数
def __init__(self, name):
self.name = name
self.__age = 18 # 在需要设置的属性或方法前加双下划线,即设置私有属性或私有方法
def display(self):
print('%s的年龄是%d' % (self.name, self.__age))
s = Student('李四')
# 此时age属性为私有属性,不能进行外部访问,否则会报错
#print(s.__age)
# 以单下划线+类名的显示,可以访问私有属性,在pycharm中可以看到这里有黄标,提示这里是不希望访问的
print(s._Student__age)
输出:18
# 使用__dict__查看类中的所有属性
print(s.__dict__)
输出:{'name': '李四', '_Student__age': 18}
s.display()
输出:李四的年龄是18
二、property装饰器
property装饰器把方法包装成属性,让方法可以以属性的形式被访问和调用。
- 被 @property 装饰的方法是获取属性值的方法,被装饰方法的名字会被用做 属性名。
- 被 @属性名.setter 装饰的方法是设置属性值的方法。
- 被 @属性名.deleter 装饰的方法是删除属性值的方法。
class Student(object):
def __init__(self):
# 私有属性
self.__age = 0
@property # 当对象调用age属性的时候就会执行下面的方法
def age(self):
print('获取属性')
return self.__age
@age.setter # 当对象调用age属性设置值的时候会自动调用下面的方法
def age(self, new_age):
print('设置属性')
if new_age >= 0 and new_age <= 130:
self.__age = new_age
else:
print("超出基础值")
@age.deleter
def age(self):
print(self.__age)
del self.__age # 前后打印,验证删除是否成功
print(self.__age)
# 提示:使用装饰器方式的proprey属性那么方法名要保持一致
student = Student()
age = student.age
print(age)
student.age = 20 # 修改age的值,自动调用@age.setter
age = student.age
print(age)
del student.age
三、继承
继承是面向对象三大特性之一
通过继承我们可以使一个类获取到其他类中的属性和方法
在定义类时,可以在类名后面的括号中指定当前类的父类(超类、基类)
继承提高了类的复用性。让类与类之间产生了关系。有了这个关系,才有了多态的特性
四、方法重写
如果在子类中有和父类同名的方法,则通过子类实例去调用方法时,会调用子类的方法而不是父类的方法,这个特点我们称之为方法的重写(覆盖)
当我们调用一个对象的方法时:
- 会优先去当前对象中寻找是否具有该方法,如果有则直接调用
- 如果没有,则去当前对象的父类中寻找,如果父类中有则直接调用父类中的方法
- 如果没有,则去父类中的父类寻找,以此类推,直到找到object,如果依然没有找到就报错了
方法重写的简单理解就是,王思聪从父亲王建林身上继承了他所有的东西,王建林所能做的他都能做,但在企业上,王思聪想做电竞,所以对王建林的万达改成了电竞,这种与父类方法重名,但执行效果不同的方法就叫方法重写。
class Father(object):
def enterprise(self):
print('房地产')
class Son(Father):
def enterprise(self):
print('电竞')
a = Son()
a.enterprise()
输出:电竞
五、super()
在类的继承中,如果重定义某个方法,该方法会覆盖父类的同名方法,但有时,我们希望能同时实现父类的功能,这时,我们就需要调用父类的方法了,可通过使用 super 来实现,比如:
class Animal(object):
def __init__(self, name):
self.name = name
def greet(self):
print('我是%s' % self.name)
class Dog(Animal):
def greet(self):
super().greet()
print('旺旺')
d = Dog('旺财')
d.greet()
输出:我是旺财
旺旺
super()方法多用于方法重写,当你不需要对父类方法完全重写,只是对改方法进行扩展,或者需要使用父类方法中的属性和方法是就可以进过super()进行调用
六、多重继承
Python支持多重继承,也就是一个儿子可以用有多个父亲,使用方法就是在类名后面的括号类添加需要继承的父类名,并用逗号隔开、
- 当父类方法中存在同名的方法是,会首先从括号中的父类从左右查找
- 如果父类又有各自的父类的话,将遵从深度优先,也就是从继承的第一个父类一直查找到底,在从第二个父类中找
- 如果继承的父类又继承同一个父类时,将先在父类中进行查找,再去父类的父类中去查找
标签:__,第十三,Python,self,面向对象,父类,方法,age,属性 来源: https://blog.csdn.net/qq_54010706/article/details/115336401