运用函数的好处是:提高了代码的复用率
def func():
print("123")
func() #即可调用成功
面向对象:注重于结果
面向过程:注重于细节化过程,需要严谨清晰的思路,不可出错的特点
class : 定义一个类
"""
为了区别类与函数:
定义在类里的变量称为属性,定义在类里的函数称为方法
"""
类的命名一般遵循“驼峰命名法” -- ClassPerson
定义在类里变量的引用 :类名+点操作符+操作的属性和方法+对应的参数 e.g. Person.play(name)
魔法方法:
在特定的场景之下有python解释器自动调用 #在实例化对象时自动调用
e,g, tf = Person("听风",18) 对像名=类名()
__init__函数的理解:
#初始化函数(函数)
#self代表实例化对象本身,python内部会自动转入实例,其实就是tf这个变量
#析构函数
def __del__(self):
print("%s尽行完毕")
如果再在交互模式中引用函数,函数不存在
真正未完成析构的是: (交互模式)
del zs
然而在析构函数中的代码,则是对开发者的一个提示
继承与重写
这里的pass 交互后啥都没有,__init__也没有定义,但是为什么可以呢?
子类拥有父类里面的属性解函数方法----继承
使用时,只需要把父类名放在小括号中即可
重写时必须有父类相同的函数名和参数列表,这里我们介绍两种 重写的方式:
这里我们主要使用第二种方法
# object 是所有类的父类,如果在定义类的时候没有设置父类,默认继承object
多继承:
class Test(a,b):
pass
"""
多继承最重要的是注意继承顺序,即a在前继承还是b 在前继承
交互模式中,我们也可以用 Test.mro() 类名.mro() 进行继承顺序的查看
"""
再次顺序下,默认前面一个类是后面类的子类
Test.mro()
[<class '__main__.Test'>, <class '__main__.HuNan'>, <class '__main__.HuBei'>, <class '__main__.Person'>, <class 'object'>]
对于我们的实例对象不存在时,代码会报错,后面的代码均不会运行,为了避免此场景发生,下面介绍另外的几种方法:
1. hasattr(tf,"name") #返回结果以布尔值展现
2.getattr(tf,"sex") #如果没有属性它就会报错
3.setattr(tf,"name","xxx") #意味着修改为"xxx"