文山羊 2020-02-01
类可以用来封装一类事物共同的属性和行为
1)特征:即属性:属性就是定义在类里面的变量
a.类属性:直接定义在类里面的变量(这个类的每个对象都有这个属性,里面的属性值都是一样)
共有属性:在类外面的通过类和对象都可以访问
私有属性:只能在类里面访问,类外面不要去访问
私有属性的定义:
以单下划线开头:例如,_attr = 10(在类外面可以访问,但不要在类外面使用)
以双下划线开头:例如,__attr = 100(在类外面不能直接访问)
拓展:双下划线开头的私有属性,在保存的时候其实对外是换了一个名字(__属性 =====> _类名__属性)
b.对象属性(实例属性):这一类事物都可能会有这个属性,属性值有可能不一样(自己独立的属性)
对象属性的定义:
方式一:通过对象进行赋值:对象.属性=属性值(在类外面)
方式一:通过初始化方法__init__进行定义:self.属性 = 属性值(在类里面的__init__方法中 )
self:代表的是对象本身,那个对象去调用方法,self代表的就是那个对象
2)__init__方法:可以用来初始化对象属性
3)对象,是通过类创建出来的,拥有这个类的所有的行为和特征
通过类创建对象:
obj = 类名()
2)行为:方法,即函数,方法就是定义在类里面的函数,方法里面的第一个参数必须是self(这是规范)
注意:
①对象可以访问类属性
②对象可以访问对象属性
③对象可以调用方法
④类可以访问类属性
⑤类不能访问对象属性
⑥类不能调用方法
1)使用关键字:class
语法:
方式一:class 类名:
# 类的属性和方法
方式二:class 类名(object)
# 类的属性和方法
2)类的定义规范:
1、遵循标识符的命名规范
2、类名的风格:严格遵循大驼峰命名法(即,每个单词的第一个字母必须大写)
对象方法(实例方法):
对象方法的第一个参数,是self,self代表是对象本身
只能通过对象去调用,对象.方法名()
类方法:应用场景,如果这个方法以类为主体去调用,方法内部不会涉及到对象属性和对象方法的使用,那么该方法就应该定义成类方法
在定义方法前加一个@classmethod
类方法的第一个参数,是cls,cls代表的是类本身
即可以通过对象去调用,也可以通过类去调用(对象.方法名() 或者 类.方法名() )
静态方法:应用场景,如果内部不会使用类属性和类方法,也不会使用对象和属性方法的使用,那么该方法就应该定义成静态方法
静态方法的定义:在定义方法前加一个@staticmethod
没有必须要定义的固定参数
既可以通过对象去调用,也可以通过类去调用(对象.方法名() 或者 类.方法名() )
继承关系注意点:
通过继承可以获取父类的方法和属性
私有的属性是不能继承的(双下划线的私有属性不能继承)
一个类可以同时继承多个父类。子类都可以继承所有的父类(多继承时,是按顺序继承)
1)定义:在子类中定义和父类同名的方法,这个操作叫做重写父类的方法
2)关于方法调用:
子类可以继承父类的方法,意味着子类可以调用父类的方法(父类不能调用子类的方法)
如果子类重写了父类方法,那么在调用时,他优先调用自身的方法
3)关于在子类的方法中,如何调用被重写的父类方法(调用父类同名的方法)
第一种:父类名.方法名(self)
第二种:super().方法名() # super可以调用同名的父类方法(一级一级往上找父类同名方法)
1)内置函数setattr:设置属性
参数一:类名/对象
参数二:属性名
参数三:属性值
2)内置函数getattr:获取属性
参数一:类名/对象
参数二:属性名
3)内置函数delattr:删除属性
参数二:类名/对象
参数二:属性名
class Singleton: def __new__: # 关键在于这,每一次实例化的时候,我们都只会返回这同一个instance对象 if not hasattr: cls.instance =