Python 面向对象类

本文详细介绍了Python的面向对象编程,包括类的概念、实例、属性和方法。讲解了如何创建和初始化类,如何使用self和修改属性,以及添加和调用方法。还涉及类属性、类方法、静态方法的使用,类的继承、模块导入和标准库Turtle类的继承实践。同时,讨论了如何将其他实例作为属性,并利用isinstance()进行实例判断。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

核心概念:类,实例,属性,方法
类:模板,如人类
实例:用模板造出的对象,如貂蝉
属性:是特征
方法:是行为

属性是静态的,方法是动态的,属性是描述有什么特征,方法是说这个类可以干什么,属性不用带括号,方法必须带括号,方法不需要print,属性需要print

面向过程就是直接写函数,c语言就是面向过程,java是面向对象,python二者都可

1、最简单的类

# 类就是一个模板,创建一个狗类
class Dog:
	pass    # 空的类

d1 = Dog()   # 创建第1个实例,实例就是类名加括号
d2 = Dog()  # 创建第二个实例

d1.name = '大黄'  # 赋予属性

print(d1.name)  #访问一个属性就是用.
print(d2.name)

2、在__init__中给类加上属性

class Dog:

	# 构造方法
	def __init__(self, name, height, blood, power): # 传给属性,在一个类里面,类的一个方法第一参数必须加上self
		self.name = name  # 赋值给自己,给当前创建好的实例
		self.height = height
		self.blood = blood
		self.power = power


d1 = Dog('大黄', 0.7, 10, 3)   # 创建第1个实例,实例就是类名加括号,传入参数,第一个self不用传
d2 = Dog('二狗', 0.5, 10, 4)  # 创建第2个实例


print(d1.name, d1.height, d1.blood, d1.power)  #访问一个属性就是用.
print(d2.name)

3、self和默认属性,以及修改属性

class Dog:

	# 构造方法
	def __init__(self, name, height, power): # 传给属性,在一个类里面,类的一个方法第一参数必须加上self
		self.name = name  # 赋值给自己,给当前创建好的实例
		self.height = height
		self.power = power
		self.blood = 10    # 有些属性不一定要传进来,可以在模板里面直接创建好


d1 = Dog('大黄', 0.7, 3)   # 创建第1个实例,实例就是类名加括号,传入参数,第一个self不用传
d2 = Dog('二狗', 0.5, 4)  # 创建第2个实例


print(d1.name, d1.height, d1.blood, d1.power)  #访问一个属性就是用.
print(d2.blood)

# 4、访问属性和修改属性
d2.blood = 9  # 修改属性直接用赋值语句
print(d2.blood) # 属性不用带括号

print(id(d1))  #访问内存地址
print(id(d2))

4、添加和使用方法

class Dog:

	# 构造方法
	def __init__(self, name, height, power): # 传给属性,在一个类里面,类的一个方法第一参数必须加上self
		self.name = name  # 赋值给自己,给当前创建好的实例
		self.height = height
		self.power = power
		self.blood = 10    # 有些属性不一定要传进来,可以在模板里面直接创建好

	#添加方法,所有类里面的参数必须要有self
	def bark(self):
		print(f'我是{self.name},身高{self.height},血量{self.blood},攻击力{self.power}') # self就指代当前的变量

	def attack(self, dog2): #传入被攻击的那条狗
		dog2.blood = dog2.blood - self.power # 血量减去攻击力的参数


d1 = Dog('大黄', 0.7, 3)   # 创建第1个实例,实例就是类名加括号,传入参数,第一个self不用传
d2 = Dog('二狗', 0.5, 4)  # 创建第2个实例

# 不用print,因为自身带了print
d2.bark() # 调用方法时,也是用实例名字.方法名字再带上括号
d1.attack(d2) # d1攻击d2
d2.bark()

5、通过方法改变属性的值

class Dog:

	# 构造方法
	def __init__(self, name, height, power): # 传给属性,在一个类里面,类的一个方法第一参数必须加上self
		self.name = name  # 赋值给自己,给当前创建好的实例
		self.height = height
		self.power = power
		self.blood = 10    # 有些属性不一定要传进来,可以在模板里面直接创建好

	#添加方法,所有类里面的参数必须要有self
	def bark(self):
		print(f'我是{self.name},身高{self.height},血量{self.blood},攻击力{self.power}') # self就指代当前的变量

	def attack(self, dog2): #传入被攻击的那条狗
		dog2.reduce_blood(self.power)

	def reduce_blood(self, reduce_value):  #减少的血量
		if reduce_value > self.blood:    # 减少的血量大于自身的血量
			self.blood = 0
		else:
			self.blood = self.blood - reduce_value

d1 = Dog('大黄', 0.7, 3)   # 创建第1个实例,实例就是类名加括号,传入参数,第一个self不用传
d2 = Dog('二狗', 0.5, 4)  # 创建第2个实例

# 可以改变属性的值
# d1.blood = d1.blood - 4
# d1.blood = d1.blood - 4
# d1.blood = d1.blood - 4 # 连续减里面可能为负
# d1.bark() #bark里面只有self的话,调用不用给参数

d1.reduce_blood(4)
d1.reduce_blood(4)
d1.reduce_blood(4)
d1.bark()

6、类属性

a.整个类只有一份,所有的实例都共享这一份
b.可以通过类名或者实例名访问类属性,访问的都是同一个
c.修改属性需要通过类名
d.因为通过实例名就会创建一个同名的实例变量
e.实例变量和类变量同名时,使用实例变量有限使用的是实例变量

类方法:可以通过类名调用,也可以通过实例名调用

类方法和实例方法的区别:
1、类方法不能访问实例变量,可以访问类变量
2、类方法需要加上@classmethod,第一参数必须是class (cls)

静态方法:
1.需要使用@staticmethod
2.不需要传入实例或者类作为第一个参数

class Dog:
	# num_of_dogs = 0 #类属性
	dogs = []  #用来保存所有狗的列表

	# 类方法    
	@classmethod   # 加标注,类方法
	def num_of_dogs(cls):
		return len(cls.dogs)  #帮我们数一下数组里有多少个

	@classmethod
	def biggest(cls):
		max_height = -1
		for d in cls.dogs:
			if d.height > max_height:
				max_height = d.height
		return max_height

	@staticmethod  #静态方法
	def intro():
		print("Dog is human's best friend")

	# 构造方法——实例方法,添加实例属性,做其他的初始化工作
	def __init__(self, name, height, power): # 传给属性,在一个类里面,类的一个方法第一参数必须加上self
		self.name = name  # 赋值给自己,给当前创建好的实例
		self.height = height
		self.power = power
		self.blood = 10    # 有些属性不一定要传进来,可以在模板里面直接创建好
		# Dog.num_of_dogs = Dog.num_of_dogs + 1
		Dog.dogs.append(self)  #将刚刚创建的这条狗self放进去
		print(f'{self.name}出生了,汪汪')

	#添加方法,所有类里面的参数必须要有self
	def bark(self):
		print(f'我是{self.name},身高{self.height},血量{self.blood},攻击力{self.power}') # self就指代当前的变量

	def attack(self, dog2): #传入被攻击的那条狗
		dog2.reduce_blood(self.power)

	def reduce_blood(self, reduce_value):  #减少的血量
		if reduce_value > self.blood:    # 减少的血量大于自身的血量
			self.blood = 0
		else:
			self.blood = self.blood - reduce_value

d1 = Dog('大黄', 0.7, 3)   # 创建第1个实例,实例就是类名加括号,传入参数,第一个self不用传
d2 = Dog('二狗', 0.5, 4)  # 创建第2个实例

# d1.num_of_dogs = 10 #给d1创建了一个实例属性,当实例属性和类属性相同时,通过实例访问,优先访问的是实例属性
# Dog.num_of_dogs = 8
print(Dog.num_of_dogs())#访问类属性,通过类名访问
print(d1.num_of_dogs())  #通过实例访问类属性
print(d2.biggest())  #通过实例访问类属性

Dog.intro()
d1.intro()

7、类的继承和super

class Dog:

	# 构造方法
	def __init__(self, name, height, power): # 传给属性,在一个类里面,类的一个方法第一参数必须加上self
		self.name = name  # 赋值给自己,给当前创建好的实例
		self.height = height
		self.power = power
		self.blood = 10    # 有些属性不一定要传进来,可以在模板里面直接创建好

	#添加方法,所有类里面的参数必须要有self
	def bark(self):
		print(f'我是{self.name},身高{self.height},血量{self.blood},攻击力{self.power}') # self就指代当前的变量

#牧羊犬
class Sheepdog(Dog):  #继承了Dog
	def __init__(self, name, height, power, num_of_sheep):
		#super就是在类里面引用父类
		super().__init__(name, height, power)  #父类需要这几个参数,self不用传
		self.num_of_sheep = num_of_sheep 

		#给子类添加方法
	def protect(self):
		print('我开始保护小羊了')

	# 若父类里也有同名方法,则优先调取子类里面的
	def bark(self):
		print('我是牧羊犬,我骄傲')
		super().bark()   #还想要父类里这句话就用super调用

#警犬
class PoliceDog(Dog):
	def __init__(self, name, height, power, ability):  #定义构造方法
		super().__init__(name, height, power)
		self.ability = ability

	def detect(self):
		print('我可以抓坏蛋了')

#宠物犬
class  PetDog(Dog):
	def __init__(self, name, height, power, price):
		super().__init__(name, height, power)
		self.price = price

	def sing(self):
		print('我超级可爱啊')

sd = Sheepdog('牧羊犬1', '0.6', 4, 5)
pd = PoliceDog('警犬2', 0.8, 5, 8) 
petd = PetDog('柴犬', 0.3, 4, 5)
print(sd.name)
print(sd.blood)  #调用了父类里面的
sd.bark()  #继承bark方法
sd.protect()
pd.bark()
pd.detect()
petd.bark()
petd.sing()

8、模块、类、引入

import dog

pd = dog.PetDog('小可爱', 0.2, 1, 988)
print(pd.price)
pd.bark()

9、继承标准库中的类-Turtle

继承标准库中的类,让其画一个圆圈

import turtle as t

class MyTurtle(t.Turtle):

	def big_circle(self):
		#定义圈的颜色和大小
		self.color('red')
		self.circle(100)

s = t.Screen()  #创建一个窗口
t = MyTurtle()
t.big_circle()

s.mainloop()  # 让窗口等着我,而不是代码执行完就结束

10、其他实例作为属性

新创建了一个方法狗窝,需要给宠物狗加进去

import dog

house = dog.DogHouse('9527')
pd = dog.PetDog('小可爱', 0.2, 1, 988, house)
print(pd.price)
pd.bark()

11、用isintance来判断实例

#判定狗的类型
def dog_type(self):
	if isinstance(self, SheepDog):  # isinstance是python自带的函数,用来判断当前的实例是不是SheepDog,是的话就返回牧羊犬
		return '牧羊犬'
	elif isinstance(self, PoliceDog):
		return '警犬'
	else:
		return '宠物狗'

练习题

class Car:
	def __init__(self, name, brand):
		self.name = name
		self.brand = brand

	def show(self):
		print(f'汽车名{self.name},汽车品牌{self.brand}')

	def run(self):
		print(f'汽车{self.name}跑起来了')

car = Car('小草', '宝马') #实例


print(car.name, car.brand)
car.show() #调用方法
car.run()
class Car:
	def __init__(self, name, brand, max_people):
		self.name = name
		self.brand = brand
		self.max_people = max_people
		self.number_of_people = 0
		
	def set_people(self, number):
		if number < self.max_people:
			self.number_of_people = number
		else:
			self.number_of_people = self.max_people

	def increase_people(self):
		if self.number_of_people < self.max_people:
			self.number_of_people += 1
			print(f'{self.number_of_people}名乘客在车上')
		else:
			print(self.max_people),print('满了')

	def reduce_people(self):
		if self.number_of_people > 0:
			self.number_of_people -= 1
			print(f'{self.number_of_people}名乘客在车上')
		else:
			print('车上')

car = Car('和谐号', '动车', 100)
car.set_people(50)

car.increase_people()
car.reduce_people()
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值