1、类的定义与实例化
类的定义
- 使用class语句来创建一个新类,class之后为类的名称并以冒号结尾,有无()均可。
- 类名应采用驼峰命名法,即将类名中每个单词的首字母都大写,而不使用下划线。
- 使用__init__函数初始化
类的实例化
- 根据类来创建对象被称为实例化,类的实例化类似函数调用方式
- 在创建实例的时候,可将必要的属性通过在实例初始化时调用__init__函数填写进去
代码实例:
class Class1:
# 类文档字符串
'这是一个类'
def __init__(self,property1=1,property2=2):
self.property1 = property1
self.property2 = property2
instance1 = Class1(property1=3,property2=4)
instance2 = Class1()
类的属性:类中有三种属性,内置属性,类属性和实例属性
- 内置属性:只要你新建了类,系统就会自动创建这些属性。如__name__等
- 类属性:直接在类中定义的是类属性(类变量),可在类的所有实例中共享,使用 类名.调用
- 实例属性:在方法中定义且以self.开头的是实例属性(实例变量),对每个实例是独立的,使用 实例名. 或self. 调用。实例属性一般在__init__方法中初始化。
代码实例:
if __name__ == '__main__':
pass
class Student():
# 类属性
grade = 7
def __init__(self,age,height):
# 实例属性
self.age = age
self.height = height
类中的方法:
类中可以定义三种方法:实例方法,类方法,静态方法
- 实例方法:第一个参数是实例对象self,必须通过实例去调用。
- 类方法:需要在方法前面加@classmethod的标记符,第一个参数是类本身,一般写作cls,类和实例都可以调用。
- 静态方法:需要在方法前面加@staticmethod的标记符,没有隐含传递的参数:方法体中不能使用类或实例的任何属性和方法
代码实例:
class Student():
# 类属性
grade = 7
def __init__(self,age,height):
# 实例属性
self.age = age
self.height = height
# 实例方法
def print_age(self):
print(self.age)
# 类方法
@classmethod
def print_grade(cls):
print(cls.grade)
# 静态方法
@staticmethod
def print_info():
print('this is a student class')
# Student.print_age() # 报错信息:TypeError: print_age() missing 1 required positional argument: 'self'
Student.print_grade()
Student.print_info()
James = Student(age=12,height=160)
James.print_age()
James.print_grade()
James.print_info()
输出结果:
总结:
类型 | 标记符 | 第一个参数 | 可调用属性 | 调用 |
实例方法 | 无 | self | 实例属性&类属性 | 实例调用 |
类方法 | @classmethod | cls | 类属性 | 类调用&实例调用 |
静态方法 | @staticmethod | 无 | 无 | 类调用&实例调用 |
2、类的继承
python允许在一个或多个类的基础上生成派生类,派生类可以使用基类的一些属性和方法,这个过程就叫做继承。
为什么要继承?
提高代码冗余,提高重用性
- 基类的成员都会被派生类继承
- 当基类中某个方法不完全适用于派生类时,需要在派生类中重写父类的这个方法。
- 当基类中的属性和方法不完全满足派生类时,需要在派生类中添加新的属性和方法。
代码实例:
class Animal():
def __init__(self,age,name):
self.age = age
self.name = name
def run(self):
print('奔跑了100米')
def eat_food(self):
print('我什么都吃')
class Cat(Animal):
# 派生方法
def cat_mouse(self):
print('catched a mouse')
# 重写方法
def eat_food(self):
print('我更爱吃鱼')
cat1 = Cat(age=6, name='小花')
cat1.run()
cat1.eat_food()
cat1.cat_mouse()
输出结果:
__str__方法重写
Python中object对象有一个__str__()方法,用于返回一个对于“对象的描述”。经常用于print()方法,帮助我们查看对象的信息。__str__()可以重写。
代码实例:
class Cat(Animal):
# 派生方法
def cat_mouse(self):
print('catched a mouse')
# 重写方法
def eat_food(self):
print('我更爱吃鱼')
def __str__(self):
return ('我是一只猫,我叫'+str(self.name)+'我今年'+str(self.age)+'岁啦~')
animal1 = Animal(age=5,name='阿强')
cat1 = Cat(age=6, name='小花')
print(animal1)
print(cat1)
输出结果:
运算符重载
让自定义类生成的对象(实例)也能够使用运算符进行操作,使程序简洁易读
方法名 | 运算符和表达式 | 说明 |
__add__(self,rhs) | self + rhs | 加法 |
__sub__(self,rhs) | self - rhs | 减法 |
__mul__(self,rhs) | self * rhs | 乘法 |
__truediv__(self,rhs) | self / rhs | 除法 |
__floordiv__(self,rhs) | self // rhs | 地板除 |
__mod__(self,rhs) | self % rhs | 取模(求余) |
__pow__(self,rhs) | self ** rhs | 幂运算 |
代码实例:
def __add__(self,other):
new_age = self.age*other.age
new_name = '大魔王'
return Cat(age=new_age,name=new_name)
cat1 = Cat(age=6, name='小花')
cat2 = Cat(age=7, name='小咪')
new_cat = cat1 + cat2
print(new_cat)
输出结果:
总结:
抽象和继承
- 抽象是一个分析的过程。
- 继承是一个实现的过程。
3、类的模块化
Python允许将类存储在模块中,然后在主程序中导入所需的模块
- 主程序文件简洁易读
- 大部分逻辑存储于独立的文件中
- 专注于主程序的高级逻辑
代码实例:
class Class1():
def print_info(self):
print('模块中的第一个类')
class Class2():
def print_info(self):
print('模块中的第二个类')
class Class3():
def print_info(self):
print('模块中的第三个类')
from MyClass import Class1,Class2,Class3
instance1 = Class1()
instance2 = Class2()
instance3 = Class3()
instance1.print_info()
instance2.print_info()
instance3.print_info()
输出结果: