11.类的继承机制,私有方法与私有属性

文章目录

    • 1.方法没有重载
    • 2.方法的动态性
    • 3.私有属性和私有方法(实现封装)
    • 4.@property的使用
    • 5. 面向对象的三大特征
    • 6.继承
      • 6.1 语法格式
      • 6.2 类成员的继承和重写
    • 7.多重继承

1.方法没有重载

​ Python中,方法的的参数没有生命类型(调用时确定参数的类型),参数的数量也可以由可变参数控制。因此, Python中是没有方法的重载的。定义一个方法即可有多种词用方式,相当于实现了其他语言中的方法的重载。

如果我们在类体中定义了多个重名的方法,只有最后一个方法有效。

建议:不要使用重名的方法! Python中方法没有重载

例如:

#python中没有方法的重载,定义多个重名方法,只有最后一个有效class Person:def say_hi(self):print('hello')def say_hi(self,name):print("{}.hello".format(name))p1 = Person#p1.say_hi()	#不带参数,报错

2.方法的动态性

​ python是动态语言,可以动态的为类添加新方法,或者动态的修改类的已有方法。

#测试方法的动态性class Person:def work(self):print('努力上班')def play_game(s)print("{0}在玩游戏".format(s))def work2(s):print('好好工作')
Person.play = play_game	#python一切都是对象,等号左边定义了Person的play属性,右边即将方法函数play_game赋给了play属性,从而实现了方法的动态添加
p = Person()
p.work()
p.play()Person.work = work2	#实现了方法的动态修改
p.work()

3.私有属性和私有方法(实现封装)

​ python对于类的成员没有严格的访向控制限制,这与其他面向对象语言有区别。关于私有属性和私有方法,有如下要点

1.通常我们约定,两个下划线开头的属性是私有的( private)。其他为公共的( public)

2.类内部可以访问私有属性(方法)

3.类外部不能直接访问私有属性(方法)

4.类外部可以通过“-类名-私有属性(方法)”访私有属性(方法)

PS:方法本质上也是属性!只不过是可以通过()执行而已。所以,此处讲的私有属性和公有属性,也同时讲了私有方法和公有方法的用法。

#测试私有属性class Employee:def __init__(self,name,age):self.name = nameself.age = agee = Employee('gaoqi',18)print(e.name)
print(e.age)#如果想要把年龄私有化,那么设置__init__时可以这样:
class Employee:def __init__(self,name,age):self.name = nameself.__age = agedef __work(self):#私有方法print('好好工作')e = Employee('gaoqi',18)print(e.name)
print(e.age)	#此处就会报错说没有age属性。要访问他应该用print(e._Employee__age)e._Employee__work()	#私有方法的调用

4.@property的使用

@property可以将一个方法的调用方式变成属性调用

#测试@property的用法
class Employee:@propertydef salary(self):print("salary run...")returnemp1 = Employee()
print(emp1.salary)    #变成属性调用了#@property的装饰器用法

5. 面向对象的三大特征

Python是面向对象的语言,也支持面向对象编程的三大特性:继承、封装(隐藏)、多态。

1. 封装(隐藏)

​ 隐藏对象的属性和实现细节,只对外提供必要的方法。相当于将“细节封装起来”,只对外暴露“相关调用方法。

​ 通过前面学习的“私有属性、私有方法”的方式,实现“封装”。 Python追求简洁的语法,没有严格的语法级别的"访问控制符”″,更多的是依靠程序员自觉实现。

2.继承

​ 继承继承可以让子类具有父类的特性,提高了代码的重用性。从设计上是一种增量进化,原有父类设计不变的情况下,可以增加新的功能,或者改进已有的算法。

3.多态

​ 多态是指同一个方法调用由于对象不同会产生不同的行为。生活中这样的例子比比皆是:同样是休息方法,人不同休息方法不同。张三休息是睡觉,李四休息是玩游戏,程序员休息是“敲几行代码”。

6.继承

​ 继承是面向对象程序设计的重要特征,也是实现“代码复用”的重要手段。
​ 如果一个新类继承自一个设计好的类,就直接具备了已有类的特征,就大大降低了工作难度。已有的类,我们称为“父类或者基类”,新的类,我们称为“子类或者派生类”。

6.1 语法格式

python支持多类继承,一个子类可以继承多个父类。继承的语法格式如下:

class 子类类名(父类1,父类2...:类体

​ 如果在类定义中没有指定父类,则默认父类是 object类。也就是说, object是所有类的父类,里面定义了一些所有类共有的默认实现,比如:new_()

​ 定义子类时,必须在其构造函数中调用父类的构造函数。调用格式如下父类名,init_(self,参数列表)

class Person:def __init__(self,name,age):self.name = nameself.__age = agedef say_age(self):print(self.name,'的年龄是:',self.__age)class Student(Person):#Student就继承了Person类def __init__(self,name,age,score):self.name = nameself.__age = age#上面两行等价于Person.__init__(self,name,age)self.score = scores = Student('gaoqi',18,60)
s.say_age()
print(s.name)
print(s._Person__age)

6.2 类成员的继承和重写

  1. 成员继承:子类继承父类除构造方法之外的所有成员
  2. 方法重写:子类可以重新定义父类中的方法,这样就会覆盖父类的方法,也称“重写”。

Eg. 继承与重写的案例

class persondef init (self, name, age):self.name = name self.__age = age def say age(self)print( self.name,"的年龄是:" self.__age)def say_name(self)print('我的名字是'.format(self.name))class Student(Person):def __init__(self,name,age,score):Person.__init__(self,name,age)self.score = scoredef say_name(self):"""重写父类的方法"""print('大家好,我的名字是'.format(self.name))s = Student('gaoqi',18,60)
s.say_age()
s.say_introduce()     #这个时候就是调用了子类的方法,实现了修改          

7.多重继承

python支持多重继承,一个子类可以继承多个“直接父类”。这样就具备了“多个父类”的特点。但由于这样会把类的整体层次搞得异常复杂,尽量避免使用。

在这里插入图片描述