本文简要总结了Python类的基础知识:属性、方法、实例化、继承、封装性
Python类的基础知识
总结
- 类具有属性和方法:变量和函数
- 实例属性和实例方法,只能由实例来调用
- 类的弱封装性,私有属性或方法也可以调用
- 类的继承时遵循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原则,即子类会覆盖父类的同名属性或方法。