【Python学习记录——从入门到放弃】八、类(上)

本文详细介绍了Python中类和对象的基础知识,包括类的创建、属性和方法的使用,以及如何通过实例化来操作类。此外,还讲解了类的继承、属性的默认值设置、属性值的修改方法,以及如何在Python2.7和Python3中实现这些功能。

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

本文使用的书籍是《Python编程:从入门到实践》
本文使用的是Python3.6
一、创建和使用类

  1. 创建Dog类
class Dog():
	def __init__(self, name, age):
		self.name = name
		self.age = age
	
	def sit(self):
		print(self.name.title() + “ is now sitting.”)
	
	def roll_over(self):
		print(self.name.title() + “ rolled over!”

这是一个类的基本结构,接下来我们会一步一步学习它。

首先,在这个Dog类的创建中,class的括号里是没有东西的,因为我们要从空白创建这个类。
(1)方法__init__()
类中的函数称为方法:你前面学到的有关函数的一切都适用于方法,就目前而言,唯一重要的差别就是调用方法的方式。
init()方法是一个特殊的方法,在你使用Dog类创建新实例时,Python会自动运行它。
创建新实例的意思大概是,我们上面的例子就只是一个模板,当你要使用这个模板的东西时,要对它进行实例化。
PS:init()的方法名是固定的,不能修改。

我们将方法__init__()定义成包含三个形参:self,name和age。在这个方法的定义中,形参self必不可少,还必须位于其他形参前面。
具体原因看书中介绍。
其它两个形参,是我们定义时需要的,当然你也可以不要,也可以加入其他的形参。

(2)在Python2.7中创建类

class Dog(Object):
	def __init__(self, name, age):
		self.name = name
		self.age = age
	
	def sit(self):
		print(self.name.title() + “ is now sitting.”)
	
	def roll_over(self):
		print(self.name.title() + “ rolled over!”

多了个Object

  1. 根据类创建实例
    接下来学习如何创建实例。
class Dog():
	def __init__(self, name, age):
		self.name = name
		self.age = age
	
	def sit(self):
		print(self.name.title() + “ is now sitting.”)
	
	def roll_over(self):
		print(self.name.title() + “ rolled over!”
		
my_dog = Dog('willie', '6')
print('My dog's name is ' + my_dog.name.title() + '.')
print('My dog is ' + str(my_dog.age) + " years old.")

这里我们用Dog类这个模板创建了一个实例my_dog。
创建实例的时候,要根据Dog类的__init__中的形参对其进行赋值。

(1)访问属性
要访问实例的属性,可使用句点表示法。
例如my_dog.name

(2)调用方法
根据Dog类创建实例后,也可以使用句点表示法来调用Dog类下的方法。
例如my_dog.sit()

(3)创建多个实例
可按需求根据类创建任意数量的实例。
例如
my_dog = Dog(‘willie’, 6)
your_dog = Dog(‘lucy’, 3)

动手试一试:

# 9-1
class Restaurant():
	def __init__(self, restaurant_name, restaurant_type):
		self.restaurant_name = restaurant_name
		self.restaurant_type = restaurant_type
		
	def describe_restaurant(self):
		print("\n这家餐厅的名字是:" + self.restaurant_name + "\n这家餐厅的类型是" + self.restaurant_type)
		
	def open_restaurant(self):
		print("\n这家餐厅开始营业!")
		
my_restaurant = Restaurant('北京烤鸭', '烤鸭店')
print(my_restaurant.restaurant_name)
print(my_restaurant.restaurant_type)

my_restaurant.describe_restaurant()
my_restaurant.open_restaurant()
# 9-2
class Restaurant():
	def __init__(self, restaurant_name, restaurant_type):
		self.restaurant_name = restaurant_name
		self.restaurant_type = restaurant_type
		
	def describe_restaurant(self):
		print("\n这家餐厅的名字是:" + self.restaurant_name + "\n这家餐厅的类型是" + self.restaurant_type)
		
	def open_restaurant(self):
		print("\n这家餐厅开始营业!")
		
my_restaurant = Restaurant('北京烤鸭', '烤鸭店')
your_restaurant = Restaurant('糖醋排骨', '排骨店')
his_restaurant = Restaurant('宫保鸡丁', '鸡肉店')

my_restaurant.describe_restaurant()
your_restaurant.describe_restaurant()
his_restaurant.describe_restaurant()
# 9-3
class User():
	def __init__(self, first_name, last_name, **kd):
		self.first_name = first_name
		self.last_name = last_name
		self.preperties = {}
		for key, value in kd.items():
			self.preperties[key] = value
		
	def describe_user(self):
		print('\nfirst name: ' + self.first_name + '\nlast name: ' + self.last_name)
		for key, value in self.preperties.items():
			print(key + ': ' + value + '\n')
			
i = User('233', '233', hobby='sleep')
you = User('666', '666', favorite='study')

i.describe_user()
you.describe_user()

二、使用类和实例
下面来讲述如何使用类和实例:

  1. Car类
class Car():
	def __init__(self, make, model, year):
		self.make = make
		self.model = model
		self.year = year
		
	def get_descriptive_name(self):
		long_name = str(self.yesr) + ' ' + self.make + ' ' + self.model
		return long_name.title()
		
my_new_car = Car('audi', 'a4', 2016)
print(my_new_car.get_descriptive_name())
  1. 给属性指定默认值
class Car():
	def __init__(self, make, model, year):
		self.make = make
		self.model = model
		self.year = year
		self.odometer_reading = 0
		
	def get_descriptive_name(self):
		long_name = str(self.yesr) + ' ' + self.make + ' ' + self.model
		return long_name.title()
		
	def read_odomter(self):
		print("This car has " + str(self.odometer_reading) + " miles on it.")
		
my_new_car = Car('audi', 'a4', 2016)
print(my_new_car.get_descriptive_name())
my_new_car.read_odomter()

这是书中的方法,但是我觉得还是这样比较好。

class Car():
	def __init__(self, make, model, year,odometer_reading=0):
		self.make = make
		self.model = model
		self.year = year
		self.odometer_reading = odometer_reading
		
	def get_descriptive_name(self):
		long_name = str(self.yesr) + ' ' + self.make + ' ' + self.model
		return long_name.title()
		
	def read_odomter(self):
		print("This car has " + str(self.odometer_reading) + " miles on it.")
		
my_new_car = Car('audi', 'a4', 2016)
print(my_new_car.get_descriptive_name())
my_new_car.read_odomter()
  1. 修改属性的值
    (1)直接修改属性的值
class Car():
	def __init__(self, make, model, year,odometer_reading=0):
		self.make = make
		self.model = model
		self.year = year
		self.odometer_reading = odometer_reading
		
	def get_descriptive_name(self):
		long_name = str(self.yesr) + ' ' + self.make + ' ' + self.model
		return long_name.title()
		
	def read_odomter(self):
		print("This car has " + str(self.odometer_reading) + " miles on it.")
		
my_new_car = Car('audi', 'a4', 2016)
print(my_new_car.get_descriptive_name())
# ....
my_new_car.odometer_reading = 23
my_new_car.read_odomter()

(2)通过方法修改属性的值

class Car():
	def __init__(self, make, model, year,odometer_reading=0):
		self.make = make
		self.model = model
		self.year = year
		self.odometer_reading = odometer_reading
		
	def get_descriptive_name(self):
		long_name = str(self.yesr) + ' ' + self.make + ' ' + self.model
		return long_name.title()
		
	def read_odomter(self):
		print("This car has " + str(self.odometer_reading) + " miles on it.")
		
	def updata_odometer(self, mileage):
		self.odometer_reading = mileage

my_new_car = Car('audi', 'a4', 2016)
print(my_new_car.get_descriptive_name())
# ...
my_new_car.updata_odometer(233)
my_new_car.read_odomter()

(3)通过方法对属性的值进行递增

class Car():
	def __init__(self, make, model, year,odometer_reading=0):
		self.make = make
		self.model = model
		self.year = year
		self.odometer_reading = odometer_reading
		
	def get_descriptive_name(self):
		long_name = str(self.yesr) + ' ' + self.make + ' ' + self.model
		return long_name.title()
		
	def read_odomter(self):
		print("This car has " + str(self.odometer_reading) + " miles on it.")
		
	def updata_odometer(self, mileage):
		self.odometer_reading = mileage

	def increment_odometer(self, miles):
		self.odometer_reading += miles
		
my_new_car = Car('audi', 'a4', 2016)
print(my_new_car.get_descriptive_name())
# ...
my_new_car.updata_odometer(233)
my_new_car.read_odomter()
# ...
my_new_car.increment_odometer(100)
my_new_car.read_odomter()

动手试一试:

# 9-4
class Restaurant():
	def __init__(self, restaurant_name, restaurant_type):
		self.restaurant_name = restaurant_name
		self.restaurant_type = restaurant_type
		self.number_served = 0
		
	def describe_restaurant(self):
		print("\n这家餐厅的名字是:" + self.restaurant_name + "\n这家餐厅的类型是" + self.restaurant_type)
		
	def open_restaurant(self):
		print("\n这家餐厅开始营业!")
	
	def read_number(self):
		print("\n在这家餐厅就餐的人数:" + str(self.number_served))
		
	def set_number_served(self, number):
		self.number_served = number
		
	def increment_number_served(self, number):
		self.number_served += number
		
my_restaurant = Restaurant('北京烤鸭', '烤鸭店')
my_restaurant.read_number()

my_restaurant.number_served = 1
my_restaurant.read_number()

my_restaurant.set_number_served(2)
my_restaurant.read_number()

my_restaurant.increment_number_served(1)
my_restaurant.read_number()
# 9-5
class User():
	def __init__(self, first_name, last_name, **kd):
		self.first_name = first_name
		self.last_name = last_name
		self.login_attempts = 0
		self.preperties = {}
		for key, value in kd.items():
			self.preperties[key] = value
		
	def describe_user(self):
		print('\nfirst name: ' + self.first_name + '\nlast name: ' + self.last_name)
		for key, value in self.preperties.items():
			print(key + ': ' + value + '\n')
			
	def increment_login_attempts(self):
		self.login_attempts += 1
		
	def reset_login_attempts(self):
		self.login_attempts = 0
			
i = User('233', '233', hobby='sleep')
print(i.login_attempts)

i.increment_login_attempts()
print(i.login_attempts)

i.reset_login_attempts()
print(i.login_attempts)

三、继承
编写类时,并非总是要从空白开始。如果你要编写的类时另一个现成类的特殊版本,可使用继承。一个类继承另一个类时,它将自动获得另一个类的所有属性和方法:原有的类称为父类,而新类称为子类。子类继承了其父类的所有属性和方法,同时还可以定义自己的属性和方法。

  1. 子类的方法__init__()
class Car():
	def __init__(self, make, model, year,odometer_reading=0):
		self.make = make
		self.model = model
		self.year = year
		self.odometer_reading = odometer_reading
		
	def get_descriptive_name(self):
		long_name = str(self.yesr) + ' ' + self.make + ' ' + self.model
		return long_name.title()
		
	def read_odomter(self):
		print("This car has " + str(self.odometer_reading) + " miles on it.")
		
	def updata_odometer(self, mileage):
		self.odometer_reading = mileage

	def increment_odometer(self, miles):
		self.odometer_reading += miles
		
class ElectricCar(Car):
	def __init__(self, make, model, year):
		# ...
		super().__init__(make, model, year)
		
my_tesla = ElectricCar('tesla', 'model s', 2016)
print(my_tesla.get_descriptive_name())

子类在定义__init__()方法时,要使用super()函数指定父类的创建实例所需的信息。

  1. Python 2.7中的继承
class Car():
	def __init__(self, make, model, year,odometer_reading=0):
		self.make = make
		self.model = model
		self.year = year
		self.odometer_reading = odometer_reading
		
	def get_descriptive_name(self):
		long_name = str(self.yesr) + ' ' + self.make + ' ' + self.model
		return long_name.title()
		
	def read_odomter(self):
		print("This car has " + str(self.odometer_reading) + " miles on it.")
		
	def updata_odometer(self, mileage):
		self.odometer_reading = mileage

	def increment_odometer(self, miles):
		self.odometer_reading += miles
		
class ElectricCar(Car):
	def __init__(self, make, model, year):
		# ...
		super(ElectricCar, self).__init__(make, model, year)
		
my_tesla = ElectricCar('tesla', 'model s', 2016)
print(my_tesla.get_descriptive_name())
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值