开发者学堂课程【Python入门 2020年版:私有属性的继承特点】学习笔记,与课程紧密联系,让用户快速学习知识。
课程地址:https://developer.aliyun.com/learning/course/639/detail/10388
私有属性的继承特点
内容简介
一、类方法和静态方法回顾
二、私有属性的继承特点
一、类方法和静态方法回顾
代码如下:
class Person(object) :
def _new_(cls, *args,**kwargs) :
return object._new_(cls)
//这两行重写了一个new方法
def _init__(self, name, age):
self.name = name
self.age = age
P=Person(‘
张三’,18)
先写完以上,思考上述 new 方法是一个什么方法,是一个实例方法还是类方法?
此处 new 其实是一个静态方法,new 方法的代码上方省略了代码:@staticmethod
在 object 中查看_new_(cls,*more)该方法:
@staticmethod # known case of _new_
def _new_(cls, *more): # known special case of object._new_
""" Create and return a new object. See help(type) for accurate signat
Pass
省略的代码:
@staticmethod 可写可不写,若不写就相当于重写父类方法,若添加,可以在代码中输入 print(p)运行一下,显示结果依然可以使用
经常会省略掉
二、私有属性的继承特点
输入代码:
class Animal(object) :
def_init_(self,name,age):
self.name = name
self.age = age
def eat(self):
print(self.name + ‘
正在吃东西')
def _test(self):
print(‘我是Animal类里的test方法')
class Person(Animal) :
pass
p=Person(‘
张’,18)
print(p.name)
如果写 print(p.name)运行结果为张三
再加上 p.eat()结果就会加上 张三正在吃东西
如果再加上 p._test(),思考运行结果是否可以调用 test,运行一下,
结果显示报错:
AttributeError: ‘Person’object has no attribute ‘_test’。该 test 是一个私有方法,不能被继承
那么是否可以写为 p.Person_test()来调用?修改代码中的 pass 改为 def _demo(self):
print(‘我是 Person 里的私有方法’)
私有方法在外层调用,应该输入 p.Person_demo()来调用。
注释掉 p.Person_test(),运行结果显示为 我是 Person里的私有方法
思考那么test方法是否被继承到Person中?取消test方法的注释,运行一下,结果显示报错 AttributeError: ‘Person’object has no attribute ‘_Person_test’
没有继承下来,p.Person_demo()是自己类里定义的私有方法 ,用对象名._类名_私有方法名()来调用。p.Person_test()是父类的私有方法,子类没有继承
但是可以这样写为:
p.Animal_test(),运行结果就显示为我是 Animal 里的私有方法,可以通过 对象名._父类名_私有方法调用()
接下来看私有属性,在代码 def_init_(self,name,age)中继续输入 self._money =1000,能否通过print(p.Person_money)获取到,运行结果报错,因为它没有继承下来,找 Person 类找不到。
但是可以找到 Animal 类,修改为 print(p.Animal_money),再来运行
结果显示为1000
总结:私有属性和方法,子类不会继承