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

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 = name
        self.age = age
        
        
e = Employee('gaoqi',18)

print(e.name)
print(e.age)

#如果想要把年龄私有化,那么设置__init__时可以这样:
class Employee:
    
	def __init__(self,name,age):
        self.name = name
        self.__age = age
        
    def __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:
    
    @property
    def salary(self):
        print("salary run...")
        return
    
emp1 = 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 = name
        self.__age = age
        
    def say_age(self):
        print(self.name,'的年龄是:',self.__age)
        
class Student(Person):#Student就继承了Person类
    def __init__(self,name,age,score):
        self.name = name
        self.__age = age
        #上面两行等价于Person.__init__(self,name,age)
        self.score = score

s = 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 = score
               
      def say_name(self):
           """重写父类的方法"""
           print('大家好,我的名字是'.format(self.name))
               
s = Student('gaoqi',18,60)
s.say_age()
s.say_introduce()     #这个时候就是调用了子类的方法,实现了修改          

7.多重继承

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

在这里插入图片描述

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值