Python类的基础知识:属性、方法、实例化、继承、封装性

本文简要总结了Python类的基础知识:属性、方法、实例化、继承、封装性


总结

  1. 类具有属性和方法:变量和函数
  2. 实例属性和实例方法,只能由实例来调用
  3. 类的弱封装性,私有属性或方法也可以调用
  4. 类的继承时遵循override原则,即子类会覆盖父类的同名属性或方法。

keywords:类(class);实例(instance);属性(attribute);方法(method);封装(closure);继承()

一、定义和实例化

1. 定义

类是具有完全或部分相同特征的对象。这些特征用属性或方法来衡量。例如不同学生的相同特征是姓名和成绩。

类在定义时,通常类的标识符首字母要大写

2. 实例化

类实例化后,类中定义的属性和方法,就变成了实例的属性和方法。

下面给出一个简单的类的定义和实例化:

在这里插入图片描述

二、属性

属性是指类的特征之一,可简单地理解成变量,属性又分为类属性和实例属性,它们主要的区别是,实例属性需要在类实例化的时候进行初始化,而类属性是不同实例所共有的。

1. 最特殊的方法 _init_

  • 创建实例时自动调用进行初始化属性
  • 初始化的是实例的属性
  • __init__外的变量是类的属性
  • self 必须要有且是第一个参数
  • 第一个参数定为self是约定俗成、也可以修改

2. 类属性

  • __init__函数外定义的

    扫描二维码关注公众号,回复: 13114033 查看本文章
    • 被所有的实例共享

3. 实例属性

  • __init__内定义的

    • 不同实例需要初始化

4. 特殊属性

  • __私有

    • 标识:双下划线开头
    • 弱封装性:其实是变成了_Class__shuangxiahua
  • _视为私有

    • 标识:单下划线开头
    • 可以被调用,但是一般视为私有变量,不轻易调用
  • _魔术_

    • 标识:两边均是双下划线
    • 魔术变量、可以被调用
  • 用处

    • 只是中间参数,不想被外部调用,或怕被传入无效参数
    • 类的封装性体现

一个简单的例子,把类的各个属性集合在一起:

class Student():
    __score = 100     # 私有变量
    _age = 20         # 视为私有
    __magic__ = 'biu' # 魔术关键字:dir()可查看
    weight = 50       # 类属性
    def __init__(self,height):
        self.height = height  # 实例属性
        
XiaoMing = Student(230)
print(Student.weight)  # 通过类调用类属性
print(XiaoMing.weight) # 通过实例调用类属性
print(XiaoMing._Student__score) # 私有变量弱封装
print(XiaoMing._age)            # 视为私有
print(XiaoMing.__magic__)       # 魔术

print(Student.height) # Error 实例属性只有实例才可以调用

实例属性只有实例才可以调用!

三、方法

方法是类的另一个特征,可以理解成是类中的函数。也同样分为类方法和实例方法,以及私有方法、静态方法(即无需任何参数传入)

  • 类方法:属于类,可以用类来调用

  • 实例方法:属于实例,用实例来调用

  • 私有方法:可能只是内部需要调用

    • __开头
  • 静态方法:无需任何参数传入

  • 实例方法、类方法、静态方法的讨论

    • 类方法和静态方法皆可以访问类的静态变量 (类变量或称类属性), 但不能访问实例变量.
 class Dog(object):
     def imeth(self):
         print('instance method ', self)
     @classmethod  # 这是装饰器
     def cmeth(cls):
         print('class method ', cls)
     # 静态方法可以理解为类中的函数, 没有self
     @staticmethod
     def smeth():
         print('static method ')
 dog = Dog()
 dog.imeth() #实例调用 绑定方法
 Dog.imeth(dog) #类调用 未绑定方法
 Dog.cmeth() # 类调用类方法
 Dog.smeth() # 类调用静态方法
 # 实例虽然也可以调用 类方法和静态方法,
 # 但是没有多大意义,类方法依旧绑定类本身
 dog.cmeth()
 dog.smeth()

四、继承

1. 子类的概念和判别

  • 获得性:子类继承父类时,会拥有父类的许多特性;

  • 具体性:因此可以把一般、范围大的属性在父类中定义,把具体、范围小的特点在子类定义。

  • 家谱性:类可以根据继承关系形成一颗树状的结构,每个节点代表一个类。

    class Human():
        def __init__(self,name,age):
            self.name = name
            self.age = age
        def pr_n(self):
            print(self.name)
    class Teacher(Human):
        pass  # 自动继承父类的属性和方法 
    
  • 判别方法
    在这里插入图片描述

2. override原则

青出于蓝而胜于蓝

  • 子类优先

  • 子类定义的方法和属性会覆盖父类的

    __init__同名:子类中的__init__函数因为与父类同名,所以会把父类中的实例属性覆盖,因此需要在子类的__init__函数中调用父类的__init__函数:

    在这里插入图片描述

    help(Human),可以查看父类中的属性有哪些

3. 多态

子类在继承父类的基础上,再定义新的变量或函数时

在这里插入图片描述

三、封装性

提高访问门槛以防出错


总结

1. 类具有属性和方法:变量和函数
2. 实例属性和实例方法,只能由实例来调用
3. 类的弱封装性,私有属性或方法也可以调用
4. 类的继承时遵循override原则,即子类会覆盖父类的同名属性或方法。

猜你喜欢

转载自blog.csdn.net/weixin_43899514/article/details/110704525
今日推荐