前言
pthon 创建类,属性,对象
一、创建及调用
- 创建类 class类名
- 创建对象 类名()
- 调用方法 对象.方法名()
class Cat: #创建类
def eat(self):
print("小猫爱吃鱼")
def drink(self):
print(f'{self.name} 喝水')
bule=Cat() #创建对象
bule.eat() #调用方法
bule.name='蓝猫'
bule.drink()
二、属性
1.添加属性
-
类外部添加属性 对象.属性名=属性值(一般不使用)
-
类内部添加属性 self.属性名=属性值
-
内部添加属性一般写在_ _ init _ _方法中
- 两个下划线开头,两个下划线结尾
- 创建对象后会自动调用
- 作用:给对象添加属性,初始化方法;默写代码,每次创建对象都要执行
- 书写注意事项,init方法中存在除了self以外的参数,必须传参
-
_ _ str_ _方法
使用print打印对象自动调用
这个方法中一般书写对象的,属性信息,定义打印对象的信息
这个方法必须返回字符串 -
_ _ del _ _方法
对象被删除销毁自动调用
class Demo:
def __init__(self,num) -> None:
print('00')
def __del__(self):
print('11')
a=Demo('a')
del a
b=Demo('b')
class People:
def __init__(self,name,weight) -> None:
self.name=name
self.weight=weight
def run(self):
print('跑步5km')
self.weight-=0.5
def eat(self):
print('吃零食')
self.weight+=0.5
def __str__(self) -> str:
return f"姓名:{self.name},体重:{self.weight}"
xm=People('小明',75)
print(xm)
xm.run()
print(xm)
xm.eat()
print(xm)
2.获取属性
- 类内部获取属性 self.属性名
- 类外部获取属性 对象.属性名
3.属性的划分
-
实例属性
- 实例对象具有的属性
- init方法中,使用self.属性名=属性值定义
- 方法中self.属性名获取
- 内存,在每个实例中都存在一份
- 使用:通过self定义;找多个对象来判断值都是一样的,如果一样的,同时变化,则一般定义为类属性,否则定位为实例属性
-
类属性
- 类对象具有的属性
- 在类内部,方法外部,直接定义变量,就是类属性
- 定义:类对象.属性名=属性值或类名.属性名=属性值
- 方法调用 类对象.属性名 或 类名.属性名
- 内存,只有在类对象中存在一份
import random
class Game:
top_score=0
@staticmethod
def show_help(self):
print('这是游戏的帮助信息')
@classmethod
def show_top_score(self):
print(f'{self.name}的最高分数是{Game.top_score}')
def start_game(self):
score=random.randint(10,100)
print(f'本次得分为{score}')
if score>Game.top_score:
Game.top_score=score
else:
pass
def __init__(self,name) -> None:
self.name=name
score=Game('小明')
score.start_game()
score.show_help()
score.show_top_score()
score.start_game()
score.show_top_score()
score.start_game()
score.show_top_score()
三、继承、重写、多态
继承
- class 类名(父类名)
- 减少代码的冗余
- 继承后子类可以使用父类公有的属性和方法
- class A 的父类是object
class A(object):
def add(self,a,b):
return a+b
class B(A):
def sub(self,a,b):
return a-b
count=B()
print(count.add(2,3))
print(count.sub(5,2))
重写
- 在子类中定义了和父类中名字相同的方法
- 父类中的方法不能满足子类对象的需求,所以重写
- 方式
- 覆盖
父类中功能完全抛弃
直接在子类中,定义和父类中相同否方法名
直接在方法中书写新代码 - 扩展
父类中的功能继续调用,添加新的功能
直接在子类中,定义和父类中相同否方法名
合适地方,调用父类中的方法
super().方法()
- 覆盖
class Animal:
def eat(self):
print('吃')
class Dog(Animal):
def say(self):
print('叫')
def eat(self):
print('00')
super().eat()
class Xtq(Dog):
def run(self):
print('跑')
dog=Xtq()
dog.eat()
dog.say()
dog.run()
多态
- 写代码调用的技巧
- 同一个方法,传入不同对象,执行不同的结果
- 以继承与重写为前提
四、对象的划分
实例对象(实例)
- 类名()创建的对象
- 创建对象的过程叫类的实例化
- 平时的对象就是实例对象
- 每个实例对象,都有自己的内存空间,保存自己的属性
类对象
- 就是类
- 类对象是python解释器在执行代码的过程中创建的
- 类对象的作用
- 使用类对象创建实例对象
类名() - 类对象有自己的内存空间,可以保存一些属性信息
- 一个代码中,一个类只有一份内存空间
五、方法的划分
使用def关键字定义在类中的函数就是方法
实例方法(常用)
- 类中直接定义
- 参数写为self表示实例对象
- 调用对象.方法名()
类方法
- 在方法名字上方书写@classmethod装饰器
- 参数一般写为cls,表示类对象
- 如果在方法中需要使用实例属性,需要使用self,可以定义为类方法
静态方法
- 基本不用
- 在方法名字上方书写@staticmethod装饰器
- 方法中不需要使用实例属性,不使用类属性,可以用静态