Python学习第十一天
类的创建
语法
class 类名:
pass
类名由一个或多个字母组成,首字母大写,其他字母小写。
直接写在类里的变量,成为类属性。
在类里定义的函数,成为类方法。
class Student:
name = '张三' # 类属性
def eat(self): # 实例方法
print(self.name + '在吃饭')
使用@staticmethod
注解来定义静态方法。
@staticmethod # 静态方法
def drink():
print('在喝水')
使用@classmethod
注解来定义类方法
@classmethod
def study(cls):
print('在学习')
初始化函数
def __init__(self, name, age):
self.name = name
self.age = age # 实例属性
对象的创建
语法:实例名 = 类名([参数])
class Student:
childhood_name = '张三' # 类属性
def __init__(self, name, age):
self.name = name
self.age = age # 实例属性
def eat(self): # 方法
print(self.name + '在吃饭')
@staticmethod
def drink():
print('在喝水')
@classmethod
def study(cls):
print('在学习')
stu = Student('xyq', 20)
print(stu.name)
print(stu.childhood_name)
print(stu.age)
####
xyq
张三
20
方法的调用
stu = Student('xyq', 20)
stu.eat()
Student.eat(stu)
####
xyq在吃饭
xyq在吃饭
类属性的使用
相当于类中的静态变量,使用类名.属性名
来调用。
print(Student.childhood_name)
####
张三
类方法的使用
使用类名.方法名()
来调用。参数是类名
Student.study()
####
在学习
静态方法的调用
使用类名.方法名()
来调用,没有参数。
Student.drink()
####
在喝水
动态绑定属性和方法
class Student:
def __init__(self, name, age):
self.name = name
self.age = age
def eat(self):
print(self.name + '在吃饭')
stu1 = Student('shy', 21)
stu2 = Student('xyq', 20)
stu2.gender = '男' # 为stu2动态绑定属性
print(stu1.name, stu1.age)
print(stu2.name, stu2.age, stu2.gender)
def show():
print('这是函数,即将绑定在类上')
stu2.show = show
stu2.show()
####
shy 21
xyq 20 男
这是函数,即将绑定在类上
面向对象的三大特征
封装、继承、多态
封装
私有变量约定用__变量
来表示
class Student:
def __init__(self, name, age):
self.name = name
self.__age = age # __age为私有变量,不希望外部访问
def show(self):
print(self.name + f'今年{self.__age}岁')
stu = Student('xyq', 20)
stu.show()
####
xyq今年20岁
继承
默认继承Object,支持多继承。
子类必须调用父类的构造方法。
语法:
class 子类(父类1,父类2,...,父类n)
pass
class Person:
def __init__(self, name, age):
self.name = name
self.age = age
print('Person类的构造函数')
def info(self):
print(self.name, self.age)
class Student(Person):
def __init__(self, name, age, score):
super().__init__(name, age)
self.score = score
print('Student类的构造函数')
Jack = Student('Jack', 17, 89)
Jack.info() # 继承来的方法
####
Person类的构造函数
Student类的构造函数
Jack 17
方法重写
子类可以重写父类中的方法,重写后可以使用super().方法()
来调用。
class Person:
def __init__(self, name, age):
self.name = name
self.age = age
def info(self):
print(self.name, self.age)
class Student(Person):
def __init__(self, name, age, score):
super().__init__(name, age)
self.score = score
def info(self):
print(self.name, self.age, self.score)
Jack = Student('Jack', 17, 89)
Jack.info()
####
Jack 17 89
Object类
是所有类的父类
多态
多态就是多种形态,在不确定对象类型时,也可以调用方法,在运行过程中动态决定调用方法的主体。
class Animal:
def eat(self):
print('动物要吃东西')
class Dog(Animal):
def eat(self):
print('狗要吃东西')
class Cat(Animal):
def eat(self):
print('猫要吃东西')
def fun(animal):
animal.eat()
fun(Animal())
fun(Dog())
fun(Cat())
####
动物要吃东西
狗要吃东西
猫要吃东西
特殊方法和特殊属性
- dict
获取属性:值
的字典
class A:
def __init__(self, name):
self.name = name
a = A('Tom')
print(a.__dict__)
####
{'name': 'Tom'}
- class
输出对象所属的类
print(a.__class__)
####
<class '__main__.A'>
- bases
获取类的父类元组
class A:
pass
class B(A):
def __init__(self, name):
self.name = name
print(B.__bases__)
####
(<class '__main__.A'>,)
- mro
获取类的层次结构
class A:
pass
class B(A):
def __init__(self, name):
self.name = name
print(B.__mro__)
####
(<class '__main__.B'>, <class '__main__.A'>, <class 'object'>)
可以看到,B继承A,B继承object
- subclasses()
查看类的子类
class A:
pass
class B(A):
def __init__(self, name):
self.name = name
print(A.__subclasses__())
####
[<class '__main__.B'>]
- add()
实现两个对象的相加操作。
class A:
def __init__(self, name):
self.name = name
def __add__(self, other):
return self.name + other.name
a1 = A('Tom')
a2 = A('Jack')
print(a1 + a2)
####
TomJack
- len()
获取对象的长度。
class A:
def __init__(self, name):
self.name = name
def __len__(self):
return len(self.name)
a1 = A('Tom')
print(len(a1))
####
3
- init()