python没有重载
python动态语言,修改已有类的新方法或者,动态修改类已有的方法都可以
这个操作相当于先把play_game的地址赋给我们的person下的play属性
私有属性和私有方法(实现封装)
封装:像手机充电器一样外面就访问不了私有的部分了
但是python不严格,没有严格的访问控制限制
定义employee 类有2个属性,name 和 age
用e去访问它,访问完,直接打印名字没问题
现在把age定义成私有属性怎么弄?
不能这么访问了,想访问用这个
自己的属性调用自己的方法在类内部是没有问题的,这里work私有方法调用employee类里的私有属性age是可行的
@property装饰器
通过@property装饰器把salary方法变成属性来调用,但是并不能像属性一样给salary赋值
下图,属性的读取和赋值就没有问题,但是假如用户输入错误就会改变属性里salary 的值,我们不能要求用户输入不犯错,所以我们要私有化属性
先私有化属性,再用set和get方法
用@property做同样的事情
面向对象的三大特征
继承
python支持多重继承,一个子类可以继承多个直接父类
object是所有类的父亲,里面定义了所有类共有的一些属性,比如:new()。
比如这里的class person的父类就是object
下图继承关系清晰
子类继承了父类的属性
私有化age这个属性,子类就无法调用了
类成员的继承和重写
下图不全,但是能看见上边部分的父类方法say_introduce被覆盖了
mor()方法来查看继承层次结构
为了查看所有属性,我们可以使用*dir()*来查看所有内置属性。
class Person:
def _init_(self,name,age):
self.name = name
self.age = age
def say_age(self):
print(self.name,"的年龄是::",self.age)
obj = object()
print(dir(obj))
s2 = Person("高淇",18)
print(dir(s2))
重写__str__()方法
object有一个__str__()方法,用于返回一个对于“对象的描述”,对应内置函数str()经常用于print()方法,帮助我们查看对象的信息。str()可以重写。
如果不重写__str__()的话,就会run出内部地址
多重继承
python支持多继承(java不能),一个子类可以有多个“直接父类”。这样,就具备了“多个父类”的特点。但是由于,这样会被“类的整体层次”搞得异常复杂,尽量避免使用。
Mro()方法
class C里有A,B的方法,但是看到括号里B在A前面,所以如果用到他们相同的方法 def say(self)的时候, 先用到的是B的say不是A的。