一、类和对象的基本了解:
1.类是具有一组相同或者相似特征(属性)和行为(方法)的一系列对象的集合。
行为——方法
特征——属性
2.对象是实实在在的东西,是类的一个实例化。
例1:小明开着他家的宝马去逛街
小明————抽象出的类是 人类
宝马————抽象出的类是 汽车
例2:坦克大战中的类
坦克:
类名————坦克
属性————血量、类型
方法————发射炮弹
墙;
类名————墙
属性————血量类型
方法————阻挡
二、定义类和对象
#定义类:
#类结构:类由3个部分组成,类的名称——类名,类的属性——一组数据,类的方法——进行操作的方法
#基本格式
class 类名object): #object可以省略不写
属性
方法
#例子:
class Person(object):
name = 'xiaopeng' #特征(属性)——姓名
age = 18 #特征(属性)——年龄
def eat(self): #行为(方法)——吃饭
print("大口地吃饭")
pass
def run(self): #行为(方法)——跑步
print("飞快地跑")
pass
#创建对象
#格式 对象名 = 类名()
#示例
class Person(object):
name = 'xiaopeng' #特征(属性)——姓名
age = 18 #特征(属性)——年龄
def eat(self): #行为(方法)——吃饭
print("大口地吃饭")
pass
def run(self): #行为(方法)——跑步
print("飞快地跑")
pass
def singing(self):
print("啦啦啦啦啦啦") #行为(方法)——唱歌
pass
d1 = Person() #创建对象
d1.eat() #调用eat()方法
d1.run() #调用run()方法
print(d1.singing()) #访问类属性
三、实例方法和属性
#实例方法
·在类的内部,使用 def 来定义一个实例方法,值得注意的是它与一般函数定义不同,类方法必须包含参数self,且作为第一个参数(self名字可以变,但位置必须要存在)
class Person(object):
name = 'xiaopeng' #特征(属性)——姓名
age = 18 #特征(属性)——年龄
def eat(self): #行为(方法)——吃饭
print("大口地吃饭")
pass
def run(self): #行为(方法)——跑步
print("飞快地跑")
pass
def singing(self):
print("啦啦啦啦啦啦") #行为(方法)——唱歌
pass
d1 = Person() #创建对象
d1.eat() #调用eat()方法
d1.run() #调用run()方法
d2 = Person()
d2.eat() #用eat()方法
d2.run() #调用run()方法
结果:
大口地吃饭
飞快地跑
大口地吃饭
飞快地跑 #结果说明在类里面定义的方法可以被不同对象调用
#属性
·类里面定义的变量,定义在类里面
·如果在类里面,但是是在方法的外面,则为类属性;
·同理,在方法里面使用self引用的属性称之为实例属性 self.变量名
·实例对象名.变量名 = 'xxxx' 此方法为添加实例属性
四、__init__ 方法
- 能够在创建对象时就顺便将对象的属性设置。
- 一个初始化方法,用来定义实例属性和初始化数据的。
class Animal(object): #创建Animal类 pass #无类属性 def eat(self): #定义方法(行为)———吃 print("吃饭") dog=Animal() #创建对象 dog.color='red' #添加实例属性 dog.name='小小' #添加实例属性 print(dog.color,dog.name) cat=Animal() #创建对象 cat.color='yellow' #添加实例属性 cat.name='大大' #添加实例属性 print(cat.color,cat.name) · · · · 如果有很多个对象,每次都要添加属性的话就很麻烦,那么就可以用 __init__(self) 方法 class Animal(object): #创建Animal类 pass #无类属性 def eat(self): #定义方法(行为)———吃 print("吃饭") def __init__(self): self.name = 'xiaoming' #定义实例属性 self.age = 'age' #定义实例属性 self.color = 'red' #定义实例属性 d1=Animal() d2=Animal() d1.name='小小' #修改实例属性 d2.name='大大' #修改实例属性 print(d1.name) print(d2.name) 这样子看起来好像没有什么区别,但实际上我们通过__init__定义了一个实例属性,它与之前的类属性不是同一回事。类属性修改通过 类名.类属性='xxx',更改后会影响创建之后的所有实例。 而实例属性通过 实例名.实例属性.='xxxxx',更改后无法修改多个对象的实例属性。
- __init__传参问题 !!!!!目前最有用,最常用方法
class Animal(object): #创建Animal类 pass #无类属性 def __init__(self,name,age,color): self.name = name self.age = age self.color = color d1=Animal('小小',18,'yellow') #创建并实例化对象 print(d1.name,d1.color) d2=Animal('大大',17,'blue') #创建并实例化对象 print(d2.name,d2.age,d2.color) 结果: 小小 yellow 大大 17 blue
#同理我们可以完善eat函数
class Animal(object): #创建Animal类
pass #无类属性
def __init__(self,name,age,color):
self.name = name
self.age = age
self.color = color
def eat(self,food): #定义方法(行为)———吃
print(self.name+"喜欢吃"+food)
d1=Animal('小小',18,'yellow')
d1.eat('rice') #
结果:
小小喜欢吃rice
五、理解self
- self和我们创建的对象指向同一个地址,可以认为self就是对象的引用。
#示例
class Person(object): #创建Person类
def eat(self): #定义一个eat方法(行为)
print('self=%s',id(self)) #调用函数id()输出self参数的地址
pass
pass
d1=Person()
print('d1=%s',id(d1)) ##调用函数id()输出对象d1的地址
d1.eat()
- self的传参问题,在上面我们已经可以知道self可理解为对象本身,某个对象调用其方法时,python的解释器会把这个对象作为第一个参数传给self,所以作为开发者我们只需传递后面的参数。
#示例
class Person(object): #创建Person类
def eat(self,name,food): #定义一个eat方法(行为)
print("%s 喜欢吃%s"%(name,food))
pass
pass
d1=Person()
d1.eat('小为','米饭')
- self的名字可以更改,只是我们约定俗成使用self
#示例
class Person(object): #创建Person类
def eat(good,name,food): #定义一个eat方法(行为)
print("%s 喜欢吃%s"%(name,food))
pass
pass
d1=Person()
d1.eat('小为','米饭')
#示例
class Person(object): #创建Person类
def __init__(self,pro):
self.pro = pro
def eat(a,name,food): #定义一个eat方法(行为)
print("%s 喜欢吃%s , 他的专业是 %s "%(name,food,a.pro)) #这里的a.pro==d1.pro
pass
pass
d1=Person('数学')
d1.eat('小为','米饭')