Preparatory Class-Day9------面向对象

一、 概念

1. 对象(实例)

> 万物皆对象
> 对象是具有 行为(函数)属性(变量名)
举例:桌,椅,板凳

(1) 属性[名词] 材质,长度,性别,长短... ----  变量名绑定变量值
(2) 行为[动词] 起床、上班、打游戏         ----  使用函数


2. 类(类别)

> 把具有相同属性和行为的属性划为一类
> 类的大小按照需求分,取决于颗粒度的选择
> 划分的时候,一般来说,相同类别的对象之间总是比不同类别的对象之间更相似。
举例:木制品类 --- 桌子、椅子、茶几
学生管理系统:Student, Teacher
公交刷卡系统:Person, Ticket, Station

3. 类和对象之间的关系

> 类是对象的抽象,对象是类的具体体现
> 类 ---  模板、蓝图
  对象 ---  类设计出来的实例
  
举例:
人的类: 身高、体重、 身高
人的对象:  [name = 张三, 身高 = 180, 体重 = 130]

二、 定义和初始化

1. 类的定义

(1) 格式

class 类名[(父类)]: # ()可写可不写
#‘注释:某各类’
类体
举例:
class Person:

(2) 产生对象: 类名()

举例:
p1 = Person -----打印出是对象的地址
# 输出注释
print(p1.__doc__)

> 一般情况下,把属性和行为定义到类中,称为实例属性和实例方法

2. 定义类中的属性和行为

(1) 在类中定义对象的行为

类的行为: 以函数的形式存在,相当于在类体中定义函数,来处理对象 
> 调用类中的行为的时候,self不需要传
> 定义在类中的属性和行为(方法),可以直接访问
> self表示当前对象

举例:
class Person:
def run(self): # self表示当前对象
print('I am running')
p1 = Person()
p1.run()

(2) 定义类中的属性(对象的初始化)

def __init__(self): # self为约定俗成
> __init__在创建对象时候执行,但是该方法不是创建初始化的方法
> 对象的属性通过self.属性名=属性值 来赋值
> 如果一个信息和该类不相关,尽量不要定义为类中的属性,而是传入对象
> 能够定义在init中的属性,一定是类的强依赖关系
> 弱依赖属性通常先赋值None,调用前赋值
举例:
class Person:
def __init__(self, name, age):
print('z')
print('执行__init__:')
对于当前person类产生的所有对象都产生作用,即都包含name属性
# 可以通过传入参数的形式,创建对象
self.name = name
self.age = age

# 在类的实例方法中, 调用实例属性,需要用self
def run(self, place): # self表示当前对象
print('{} am running at {}'.format(self, place))

p1 = Person('张珊',20)
print(p1.age)
print(p1.run('公路'))


Practice:
1. 创建一个狗类:
2. 定义对象属性: name age type
3. 定义对象的行为
class Dog:
		'''
		Practice:
		1. 创建一个狗类:
		2. 定义对象属性:
		3. 定义对象的行为
			叫:
			吃饭:
			睡觉:
		'''
		# 创建对象属性
		def __init__(self, name, age, type):
			self.name = name
			self.age = age
			self.type = type


		def bark(self):
			return '叫什么叫'
		def eat(self, sth):
			return '{}今天吃{}'.format(self.name,sth)
		def sleep(self, time):
			if time not in range(6,20):
				return '还是白天,睡什么睡'
			else:
				return '该休息了了'

	dog1 = Dog('Tom',12,'金毛')
	dog2 = Dog('Jeff',2,'二哈')
	dog3 = Dog('Lisa',3,'银狐')
	print(dog1)
	print(dog3.eat('狗粮'))
	print(dog2.sleep(1))

3. 类中的成员

1)实例属性和实例方法
2)类属性和类方法
3)静态方法


(1)类属性

不需要通过init方法,直接在类下定义,以变量绑定的形式存在
> 实例属性跟每一个对象相关,类属性只跟类有关,与对象无关,独享
> 类属性是公用的,类属性只跟类有关,与对象无关

访问: 必须现有实例,通过实例才能访问到实例属性
a. 类名.类属性,可以访问和修改类属性(推荐)
b. 对象.类属性,不能修改类属性

# 例子:
		class Person:
			desc = '人的描述'		# 类属性
			def __init__(self):		
				self.name = name	# 实例属性定义在init下
		p1 = Person	()	
		
		# 访问
		print(Person.desc)
		print(p1.desc)
		# 但是作用不同
		Person.desc = 'sds'  	--- 
		p1.desc = 'sds' 	(不能对类属性进行更改)---给一个实例(对象),加了一个实例属性

# 只取就近什么意思

(2) 类方法

> 只跟类相关的方法
> 实例方法跟每一个对象关联
> 需要加一个装饰器@classmethod
> 可以通过来表示
a. 对象.类方法 
b. 类名.类方法访问
> 应用场合: 给类方法实现复制对象的功能
> cls代表当前类

class Person:
desc  = 'new'
def __init__(self, name, age)
self.name = name
self.name = age

@classmethod
def class_method(cls): #cls当前类
print(cls is Person)
def run(self):
pass
@classmethod
def copy1(p):

p1 = Person ()
p2 = Person.copy(p1)

(3) 方法对于属性的访问:

1) 类方法访问类属性 --- cls

直接使用cls

2) 类方法访问实例属性 --- 不推荐

# 类方法:承诺只跟类有关,在类方法下访问实例不合理
# 如果一定要访问,可以添加

3) 实例方法访问类属性 --- 类名,__class__desc

a. Person.desc
b. self.__class__desc   # 表示当前对象所在的类,通过self找cls
# 推荐

4) 实例方法访问实例属性(最常用)

直接使用self

猜你喜欢

转载自blog.csdn.net/u010359398/article/details/80946128
今日推荐