面向对象的三大特征
- 封装:提高程序的安全性
- 将数据(属性)和行为(方法)包装到类对象中,在方法内部对属性进行操作,在类对象的外部调用方法,这样无需关心方法内部具体的实现细节,从而隔离了复杂度
- 在Python中没有专门的修饰符用于属性的私有,如果该属性不希望在类对象外部访问,前边使用两个“-”
- 继承:提高代码的复用性
- 多态:提高程序的可扩展性和可维护性
封装代码实现
class Peo:
def __init__(self,name,age,score):
self.name=name
self.age=age
self.__score=score
def SetScore(self,score):
self.__score = score
def GetScore(self):
return self.__score
people = Peo('张三',10,34)
print(people.name)
print(people.age)
people.SetScore(100)
print(people.GetScore())
继承
语法格式
class 子类名 (父类1,父类2..)
pass
注意:
如果一个子类没有继承任何类。默认继承Object
Python支持多继承
定义子类时,必须在其构造函数中调用父类的构造函数
样例展示
class Peo:
def __init__(self,name,age,score):
self.name=name
self.age=age
self.__score=score
def SetScore(self,score):
self.__score = score
def GetScore(self):
return self.__score
class Peo1(Peo):
def __init__(self,name,age,score,gender):
super(Peo1, self).__init__(name,age,score)
self.genger=gender
p = Peo1('张三',18,80,'男')
print(p.age)
print(p.name)
print(p.GetScore())
print(p.genger)
```class Peo:
def __init__(self,name,age,score):
self.name=name
self.age=age
self.__score=score
def SetScore(self,score):
self.__score = score
def GetScore(self):
return self.__score
class Peo1(Peo):
def __init__(self,name,age,score,gender):
super(Peo1, self).__init__(name,age,score)
self.genger=gender
p = Peo1('张三',18,80,'男')
print(p.age)
print(p.name)
print(p.GetScore())
print(p.genger)
方法重写:如果子类对于继承父类的某个方法或某个属性不满意时可以在子类中对其方法体进行编写
子类重写后的方法中可以通过super().xxx()调用父类被重写的方法
特殊属性、特殊方法
名称 | 描述 |
---|---|
_ dict() _ | 获取类对象或实例对象所绑定的所有方法和属性的字典 |
_ len()_ | 通过重写_len()_的方法,让内置函数len()的参数可以是自定义类型的 |
add() | 通过重写_add()_方法,可以使自定义对象具有“+”功能 |
new() | 用于创建对象 |
init() | 用于初始化对象 |
赋值与拷贝
- 遍量的赋值操作
只是形成两个变量,实际上还是指向同一个对象 - 浅拷贝
Python拷贝一般都是浅拷贝,拷贝时,对象包含的子对象内容不拷贝,因此源对象和拷贝对象会同时引用一个子对象 - 深拷贝
使用copy模块的deepcopy函数,递归拷贝对象中包含的子对象,源对象的拷贝对象所有的子对象也不相同
具体区别见:具体区别