1.什么是方法,什么是函数
1 class Foo:
2 def chi(self):
3 print("我是吃")
4
5 @staticmethod
6 def static_method():
7 pass
8
9 @classmethod
10 def class_method(cls):
11 pass
12
13 f = Foo()
14 print(f.chi) # <bound method Foo.chi of <__main__.Foo object at 0x10f688550>>
15 print(Foo.chi) # <function Foo.chi at 0x10e24a488>
print(Foo.static_method)
# <function Foo.static_method at 0x10b5fe620>
print(Foo.class_method)
# bound method Foo.class_method of <class '__main__.Foo'>>
16 print(f.static_method) # <function Foo.static_method at 0x10e1c0620>
17 print(f.class_method) #<bound method Foo.class_method of <class '__main__.Foo'>>
仔细观察, 我们能得到以下结论:
1. 类⽅方法. 不论任何情况, 都是⽅方法.
2. 静态⽅方法, 不论任何情况. 都是函数
3. 实例例⽅方法, 如果是实例例访问. 就是⽅方法. 如果是类名访问就是函数.
2,从程序的角度上也是可以判断的
1 from types import MethodType, FunctionType
2 print(isinstance(a.func,MethodType)) #MethodType 方法类型
3 print(isinstance(A.func,MethodType))
4 print(isinstance(a.func,FunctionType)) #FunctionType 函数类型
5 print(isinstance(A.func,FunctionType))
3.pickle
1 # pickle 游戏人物的状态的保存(存档读档) 2 import pickle 3 pickle模块可以序列化python中的所有自定义类的对象 4 class Course: #创建一个课程类 5 def __init__(self,name,price,period): 6 self.name = name #课程的名字=名字 7 self.price = price #课程的价格=价格 8 self.period = period #课程的周期=周期 9 class Student: #创建一个学生类 10 def __init__(self,name,price,period): 11 self.name = name #名字=名字 12 self.price = price 13 self.period = period 14 python = Course('python',88888,'6 months') #实例化一个python 15 linux = Course('linux',88888,'6 months') #实例化一个linux
with open('courses','wb') as f: #把python实例化以wb模式写入到courses文件中
pickle.dump(python,f)
with open('courses1', 'wb') as f: #把linux实例化以wb模式写入到courses1文件中
pickle.dump(linux,f)
with open('courses','rb') as f: #以rb的模式读出python
python = pickle.load(f)
with open('courses1', 'rb') as f: #以rb的模式读出linux
linux = pickle.load(f)
print(python.name) #输出python的名字
print(linux.name) #输出linux的名字
22 # 如果load一个对象,那么这个对象所对应的类必须已经在内存中
# 同一个类的对象 会存储在同一个文件中
#如果我不希望这个对象的load受到类读入的影响,就把这个类也写入到文件里
4.继承
子类可以自动拥有父类中除了私有属性外的其他所有所有内容
5.继承就是解决类与类之间代码重复的问题
6.类的继承语法:
7,使用继承这个概念的过程:
1 class Animal: 2 def __init__(self,name,kind,): 3 self.name = name 4 self.kind = kind 5 6 class Cat(Animal): 7 pass 8 class Dog(Animal): 9 pass 10 11 小花 = Cat('小花','金吉拉','喵喵') 12 print(小花) 13 print(小花.name) 14 print(小花.kind)
# 先开辟一块空间,并且空间中已经有了一个类指针,指向Cat
# 执行__init__方法,在Cat类的空间中没有init方法,找Animal类中的init
# 将空间返回给小花变量
7,继承
子类调用方法,如果子类自己有用自己的,用了自己的就不用父类的了
如果子类自己没有才调用父类的
如果子类有个性化的父类没有的方法,可以单独定义在子类中 - 派生方法
只有子类能够使用父类中的方法,父类不可以使用子类中的方法
1 # class Animal: #创建一个动物类 [Animal 动物:a nei mo]
2 # def __init__(self,name,kind,language):
3 # self.name = name #动物的名字=名字
4 # self.kind = kind #动物的种类=种类 [kind 种类:kan n d ]
5 # self.language = language #动物的叫=叫 [language 叫:lan g wei z]
6 # def eat(self): #定义一个吃的方法 [eat 吃: yi t ]
7 # print('%s is eating'%self.name)
8 # def drink(self): #定义一个喝的方法 [drink 喝: zhuai k ]
9 # print('%s is drinking'%self.name)
10 # def yell(self): #定义一个叫的方法 [yell 叫: yao ]
11 # print('%s say %s'%(self.name,self.language))
12 # class Cat(Animal): #定义一个猫类 继承动物类
13 # def climb(self): # 派生方法 [climb 爬: k lai m]
14 # print('%s can climb'%self.name)
15 # class Dog(Animal): #定义一个狗类 继承动物类
16 # def lookafter_door(self): # 派生方法
17 # print('%s can look after door'%self.name)
18 # 小花 = Cat('小花','金吉拉','喵喵')
19 # 小黑 = Dog('小黑','土狗','旺旺')
20 # 小花.climb()
21 # 小黑.lookafter_door()
8,# 子类使用父类的方法
# 子类中有,父类中没有 : 用子类的
# 父类中有,子类中没有 : 用父类的
# 子类\父类中都有 : 默认情况下用子类的不用父类的
# 既想用父类又想用子类 : 父类名.方法名(子类对象),super().方法名()
# 子类\父类中都没有 : 报错
1 # class Animal:
2 # def __init__(self,name,kind,language):
3 # self.name = name
4 # self.kind = kind
5 # self.language = language
6 # def eat(self):
7 # print('%s is eating'%self.name)
8 # def drink(self):
9 # print('%s is drinking'%self.name)
10 # def yell(self):
11 # print('%s say %s'%(self.name,self.language))
12 # def sleep(self):
13 # print('%s 在睡觉'%self.name)
14 # class Cat(Animal):
15 # def climb(self): # 派生方法
16 # print('%s can climb'%self.name)
17 # def sleep(self):
18 # # Animal.sleep(self) # 父类名,主动传self
19 # # super(cat,self).sleep()
20 # # super().sleep() # super(子类名,self).方法名() 简写 记住这个就行
21 # print('团着睡')
22 # class Dog(Animal): # 派生方法
23 # def lookafter_door(self):
24 # print('%s can look after door'%self.name)
25 #
26 # 小花 = Cat('小花','金吉拉','喵喵')
27 # 小花.sleep() # 既希望走父类的基础的sleep,又希望走自己的方法
28
29 # 当某一个方法,父类和子类都拥有的时候,那么在子类的方法中,调用父类的同名方法2种
30 # 1.父类名.方法名(self,...) # Animal.sleep(self)
31 # 2.super().sleep(...) # super(self,Cat).sleep()
"""人狗大战用继承方法写出来"""
1 class Animal: #创建一个动物类 [Animal 动物:a nei mo]
2 def __init__(self,name,hp,ad): #构造一个方法
3 self.name = name
4 self.hp = hp
5 self.ad = ad
6 class Person(Animal): #创建一个人类 继承动物类
7 def __init__(self,name,sex,hp,mp,ad):
8 super().__init__(name,hp,ad)
9 self.sex = sex # 派生属性
10 self.mp = mp # 派生属性
11
12 def attack(self,dog):
13 print('%s攻击了%s'%(self.name,dog.name))
14 dog.hp -= self.ad
15
16 class Dog(Animal):
17 def __init__(self,name,kind,hp,ad):
18 super().__init__(name,hp,ad)
19 self.kind = kind # 派生属性 (在原本在父类中没有的属性,在我的子类属性中出现了)
20
21 def bite(self,person):
22 print('%s咬了%s'%(self.name,person.name))
23 person.hp -= self.ad
24
25 alex = Person('alex','不详',10,10,0.1)
26 hei = Dog('小黑','中华田园犬',999,1.1)
print(alex.hp)
hei.bite(alex)
print(alex.hp)
print(hei.hp)
alex.attack(hei)
print(hei.hp)
27 print(hei.__dict__)
什么是派生属性
在原本在父类中没有的属性,在我的子类属性中出现了