python学习笔记——类与对象

一、面向对象
面向对象是一种编程思想,即按照真实世界的思维方式构建软件系统。

二、定义类
class 类名[(父类)]:
    类体

[]部分若省略,则默认继承object类

# coding=utf-8
# 代码文件: ch9_2.py

class Car(object):
	# 类体
	pass

三、创建对象

# coding=utf-8
# 代码文件: ch9_3.py

class Car(object):
	# 类体
	pass

car = Car()

四、类的成员
在这里插入图片描述

1. 实例变量
实例变量就是对象个体特有的“数据”。对实例变量通过“对象.实例变量”形式访问。
__init__方法是构造方法,构造方法用来创建和初始化实例变量。注意,init的前后是两个下划线。

# coding=utf-8
# 代码文件: ch9_4_1.py

class Dog:
	def __init__(self, name, age):
		self.name = name # 创建和初始化实例变量name
		self.age = age # 创建和初始化实例变量age

d = Dog('旺财', 3)
print('我们家狗狗名叫{0}, {1}岁了。'.format(d.name, d.age))

2. 构造方法

# coding=utf-8
# 代码文件: ch9_4_2.py

class Dog:
	def __init__(self, name, age, sex='雌性'):
		self.name = name # 创建和初始化实例变量name
		self.age = age # 创建和初始化实例变量age
		self.sex = sex # 创建和初始化实例变量sex

d1 = Dog('旺财', 3)
d2 = Dog('招财', 1, '雄性')
d3 = Dog(name='来财', sex='雄性', age=2)

print('{0}: {1}岁{2}。'.format(d1.name, d1.age, d1.sex))
print('{0}: {1}岁{2}。'.format(d2.name, d2.age, d2.sex))
print('{0}: {1}岁{2}。'.format(d3.name, d3.age, d3.sex))

3. 实例方法
实例方法与实例变量一样,都是某个实例(或对象)个体特有的方法。

# coding=utf-8
# 代码文件: ch9_4_3.py

class Dog:
	# 构造方法
	def __init__(self, name, age, sex='雌性'):
		self.name = name # 创建和初始化实例变量name
		self.age = age # 创建和初始化实例变量age
		self.sex = sex # 创建和初始化实例变量sex

	# 实例方法
	def run(self):
		print("{}在跑...".format(self.name))

	# 实例方法
	def speak(self, sound):
		print('{}在叫, "{}"!'.format(self.name, sound))

d = Dog('旺财', 3)
d.run()
d.speak('旺 旺 旺')

4. 类变量
类变量是属于类的变量,不属于单个对象。

# coding=utf-8
# 代码文件: ch9_4_4.py

class Account:
	interest_rate = 0.0225 # 类变量利率

	def __init__(self, owner, amount):
		self.owner = owner # 定义实例变量账户名
		self.amount = amount # 定义实例变量账户金额

account = Account('Jack', 888888888.0)
print('账户名: {0}'.format(account.owner))
print('账户金额: {0}'.format(account.amount))
print('利率: {0}'.format(Account.interest_rate))

5. 类方法
类方法与类变量类似,属于类,不属于个体实例。

# coding=utf-8
# 代码文件: ch9_4_5.py

class Account:
	interest_rate = 0.0225 # 类变量利率

	def __init__(self, owner, amount):
		self.owner = owner # 定义实例变量账户名
		self.amount = amount # 定义实例变量账户金额

	# 类方法
	@classmethod
	def interest_by(cls, amt):
		return cls.interest_rate * amt

interest = Account.interest_by(88888.0)
print('计算利息: {0:.4f}'.format(interest))

五、私有变量
封装隐藏了对象的内部细节,只保留有限的对外接口,外部调用者不用关心对象的内部细节,使得操作对象变得简单。
为了防止外部调用者随意存取类的内部数据(成员变量),内部数据(成员变量)会被封装为“私有变量”。
私有变量:在变量前加双下划线。

# coding=utf-8
# 代码文件: ch9_5_1.py

class Account:
	__interest_rate = 0.0225 # 类变量利率

	def __init__(self, owner, amount):
		self.owner = owner # 创建和初始化公有实例变量owner
		self.__amount = amount # 创建和初始化私有实例变量__amount

	def desc(self):
		return "{0} 金额: {1} 利率: {2}".format(self.owner,
			                                     self.__amount,
			                                     Account.__interest_rate)

account = Account('Jack', 88888.0)
account.desc()

print('账户名: {0}'.format(account.owner))
print('账户金额: {0}'.format(account.__amount)) # 发生错误
print('利率: python ch9_5_1.py{0}'.format(Account.__interest_rate)) # 发生错误

六、私有方法
私有方法与私有变量的封装是类似的,在方法前面加双下划线。

# coding=utf-8
# 代码文件: ch9_5_2.py

class Account:
	__interest_rate = 0.0225 # 类变量利率

	def __init__(self, owner, amount):
		self.owner = owner # 创建和初始化公有实例变量owner
		self.__amount = amount # 创建和初始化私有实例变量__amount

	def __get_info(self):
		return "{0} 金额: {1} 利率: {2}".format(self.owner,
			                                     self.__amount,
			                                     Account.__interest_rate)

	def desc(self):
		print(self.__get_info())

account = Account('Jack', 88888.0)
account.desc()  # 发生错误

七、使用属性
为了实现对象的封装,在一个类中不应该有公有的成员变量,这些成员变量应该被设计为私有的,然后通过公有的set(赋值)方法和get(取值)方法访问。

# coding=utf-8
# 代码文件: ch9_5_3.py

class Dog:

	# 构造方法
	def __init__(self, name, age, sex='雌性'):
		self.name = name # 创建和初始化实例变量name
		self.age = age # 创建和初始化实例变量age

	# 实例方法
	def run(self):
		print("{}在跑...".format(self.name))

	@property
	def age(self):  # 取值,替代get_age(self):
		return self.__age

	@age.setter
	def age(self, age):  # 赋值,替代set_age(self, age):
		self.__age = age

dog = Dog('旺财', 3)
print('狗狗年龄: {}'.format(dog.age))
dog.age = 1  # dog.set_age(1)
print('修改后狗狗年龄: {}'.format(dog.age))

a. 私有变量__age,对应的属性名为去掉前面双下划线后的名称,即age。
b. 定义age属性的get()方法,使用@properpy装饰器进行修饰,方法名为属性名。
c. 访问形式为“实例.属性”。

八、继承性
a. 继承性也是面向对象重要的基本特性之一,在现实世界中继承关系无处不在。
b. 例如猫与动物之间的关系:猫是一种特殊动物,具有动物的全部特征和行为。在面向对象中动物是一般类,被称为“父类”,猫是特殊类,被称为“子类”。特殊类拥有一般类的全部数据和操作,可称为子类继承父类。

# coding=utf-8
# 代码文件: ch9_6_1.py

class Animal:

	def __init__(self, name):
		self.name = name # 创建和初始化实例变量name

	def show_info(self):
		return "动物的名字: {0}".format(self.name)

	def move(self):
		print("动一动...")

class Cat(Animal):

	def __init__(self, name, age):
		super().__init__(name) # 创建和初始化实例变量name
		self.age = age # 创建和初始化实例变量age

cat = Cat('猪猪', 1)
cat.move()
print(cat.show_info())

1. 多继承
很多语言不支持多继承,如java。
继承多个父类,如果存在多个父类拥有同一种方法,则按从左到右的顺序继承。

# coding=utf-8
# 代码文件: ch9_6_2.py

class Horse:

	def __init__(self, name):
		self.name = name # 创建和初始化实例变量name

	def show_info(self):
		return "马的名字: {0}".format(self.name)

	def run(self):
		print("马跑...")

class Donkey:

	def __init__(self, name):
		self.name = name # 创建和初始化实例变量name

	def show_info(self):
		return "驴的名字: {0}".format(self.name)

	def run(self):
		print("驴跑...")

	def roll(self):
		print("驴打滚...")

class Mule(Horse, Donkey):

	def __init__(self, name, age):
		super().__init__(name) # 创建和初始化实例变量name
		self.age = age # 创建和初始化实例变量age

m = Mule('骡暴利', 2)
m.run() # 继承父类Horse方法
m.roll() # 继承父类Donkey方法
print(m.show_info()) # 继承父类Horse方法

2. 方法重写
子类不继承父类的某些方法,而是重新定义自己的方法。

# coding=utf-8
# 代码文件: ch9_6_3.py

class Horse:

	def __init__(self, name):
		self.name = name # 创建和初始化实例变量name

	def show_info(self):
		return "马的名字: {0}".format(self.name)

	def run(self):
		print("马跑...")

class Donkey:

	def __init__(self, name):
		self.name = name # 创建和初始化实例变量name

	def show_info(self):
		return "驴的名字: {0}".format(self.name)

	def run(self):
		print("驴跑...")

	def roll(self):
		print("驴打滚...")

class Mule(Horse, Donkey):

	def __init__(self, name, age):
		super().__init__(name) # 创建和初始化实例变量name
		self.age = age # 创建和初始化实例变量age

	def show_info(self):
		return "骡: {0}, {1}岁。 ".format(self.name, self.age)

m = Mule('骡暴利', 2)
m.run() # 继承父类Horse方法
m.roll() # 继承父类Donkey方法
print(m.show_info()) # 子类Mule自己的方法

九、多态性
1.“多态”指对象可以表现出多种形态。
2.猫、狗、鸭子都属于动物,它们都有“叫”和“动”等行为,但是“叫”的方式不同,“动”的方式也不同。
3.鸭子类型测试指:若看到一只鸟走起来像鸭子,那么这只鸟可被称为鸭子。
4.python支持鸭子类型测试,python解释器不检查发生多态的对象是否继承了同一个父类,只要它们有相同的行为(方法),它们之间就是多态的。如:人,动物,汽车都有叫这个行为,但它们不一定继承了同一个父类。
设计一个函数start(),它接收具有“叫”speak()方法的对象:

def start(obj):  # 接收obj对象具有speak()方法
	obj.speak()

定义几个类,它们都有speak()方法:

class Animal:
	def speak(self):
		print('动物叫,但不知道是哪种动物叫!')

class Dog(Animal):
	def speak(self):
		print('小狗: 汪汪叫...')

class Cat(Animal):
	def speak(self):
		print('小猫: 喵喵叫...')

class Car:
	def speak(self):
		print('汽车: 嘀嘀叫...')

start()可接收所有speak()方法对象:

start(Dog())
start(Cat())
start(Car())
  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值