1 类与实例对方法和属性的修改
class Chinese: # 这是一个Chinese的类 #定义一个类属性,又称为静态数据或者静态变量,相当于C#中的static country="China" # 定义一个初始化函数, def __init__(self,name,age,gender): self.name=name self.age=age self.gender=gender #定义一个方法 def play(self,ballName): print('%s 正在打 %s' %(self.name,ballName)) #1类属性 print("----------开始修改类属性") #1.1 查看类属性 print(Chinese.country) #China #1.2 修改类属性 Chinese.country="中华人民共和国" print(Chinese.country) #中华人民共和国 #1.3 删除类属性 del Chinese.country print(Chinese.__dict__) #{'__module__': '__main__', '__init__': <function Chinese.__init__ at 0x0000000001D30EA0>, 'play': <function Chinese.play at 0x000000000247C7B8>, '__dict__': <attribute '__dict__' of 'Chinese' objects>, '__weakref__': <attribute '__weakref__' of 'Chinese' objects>, '__doc__': None} #1.4 添加类属性 Chinese.country="中国" print(Chinese.__dict__) #{'__module__': '__main__', '__init__': <function Chinese.__init__ at 0x0000000002300EA0>, 'play': <function Chinese.play at 0x000000000250C7B8>, '__dict__': <attribute '__dict__' of 'Chinese' objects>, '__weakref__': <attribute '__weakref__' of 'Chinese' objects>, '__doc__': None, 'country': '中国'} #2方法属性 print("----------开始修改方法属性") #2.1 查看方法属性 p1=Chinese('张三',18,"男") Chinese.play(p1,'篮球') #张三 正在打 篮球 #2.2 修改方法属性 def play(self,ballName,address): print('%s 在%s打%s' %(self.name,address,ballName)) Chinese.play=play Chinese.play(p1,'篮球','操场') #张三 在操场打篮球 #2.3 删除类属性 del Chinese.play print(Chinese.__dict__) #{'__module__': '__main__', '__init__': <function Chinese.__init__ at 0x0000000001D40EA0>, '__dict__': <attribute '__dict__' of 'Chinese' objects>, '__weakref__': <attribute '__weakref__' of 'Chinese' objects>, '__doc__': None, 'country': '中国'} #2.4 添加方法 def eat(self,food): print("%s 正在吃 %s" %(self.name,food)) Chinese.eat=eat print(Chinese.__dict__) # {'__module__': '__main__', '__init__': <function Chinese.__init__ at 0x0000000001D40EA0>, '__dict__': <attribute '__dict__' of 'Chinese' objects>, '__weakref__': <attribute '__weakref__' of 'Chinese' objects>, '__doc__': None, 'country': '中国', 'eat': <function eat at 0x0000000001DFC7B8>} #3实例类属性 print("----------开始修改实例类属性") #3.1 查看实例类属性 p=Chinese('张三',18,"男") print(p.country) #中国 #3.2 修改实例类属性 p.country="中华人民共和国" print(p.country) #中华人民共和国 #3.3 删除实例类属性 del p.country print(p.__dict__) #{'name': '张三', 'age': 18, 'gender': '男'} # 3.4 添加类属性 p.country="中国" print(p.__dict__) #{'name': '张三', 'age': 18, 'gender': '男', 'country': '中国'} print("----------开始修改实例属性") #4.1 查看实例类属性 p=Chinese('张三',18,"男") print(p.name) #张三 #4.2 修改实例类属性 p.name="张三三" print(p.name) #张三三 #4.3 删除实例类属性 del p.name print(p.__dict__) #{'age': 18, 'gender': '男'} # 4.4 添加类属性 p.name="张三三" print(p.__dict__) #{'age': 18, 'gender': '男', 'name': '张三三'} print("----------开始修改实例方法") #4.1 查看实例方法 p=Chinese('张三',18,"男") p.eat('包子') # 张三 正在吃 包子 #4.2 修改实例类属性 def eat(self,food,address): print('%s在%s吃%s' %(self.name,address,food)) p.eat=eat p.name="张三三" p.eat(p,"包子","食堂") #张三三在食堂吃包子 #4.3 删除实例类属性 del p.eat print(p.__dict__) #{'name': '张三三', 'age': 18, 'gender': '男'} # 4.4 添加实例方法属性 def study(self,cont): print('%s学%s' % (self.name,cont)) p.study = study p.study(p,'python') print(p.__dict__) #张三三学python # {'name': '张三三', 'age': 18, 'gender': '男', 'study': <function study at 0x0000000002526B70>}
2 静态属性、静态方法、类方法
class Room: owner="China" # 这是一个房间的类 def __init__(self,name,width,length,height): self.name=name self.width=width self.length =length self.height=height @property # 这是一个方法,但是通过@property装饰后,就变成了一个静态方法,可以通过.方法名调用 def getArea(self): return self.width*self.length @classmethod # 这是一个方法,但是通过@classmethod装饰后,就变成了一个类方法,可以类调用,不用实例化 def getOwner(cls): print("房产所有者"+cls.owner) @staticmethod # 这是一个方法,但是通过@staticmethod装饰后,就变成了一个静态方法,可以在调用处直接传递参数 # 用户输入想要的面积和折扣,可以计算出价格 def getPrice(area,discount): return area*20000*discount/10 r1=Room("天字一号房",10,20,2) print('房间面积'+str(r1.getArea)) #房间面积200 #类方法:可以通过类名直接调用方法 Room.getOwner() #房产所有者China #静态方法,可以传递一些与类关联不大的数据 print(r1.getPrice(r1.getArea,9)) #3600000.0
3 组合(大类包含小类)
class School: # 这是一个学校类 def __init__(self,name,address): self.name=name self.address=address class Courses: # 这是一个课程类,组合了一个学校 def __init__(self, name, cycle,price,schoolObj): self.name = name self.cycle = cycle self.price = price self.school = schoolObj def getInfo(self): print('%s 正在开设 %s' %(self.school.name,self.name)) school = School('北大','北京') Courses('python','100','10',school).getInfo()
4 继承
#继承一:抽象出共有的父类,实现继承 class Animal: def __init__(self,name): self.name=name def eat(self): print('%s会吃' %(self.name)) def bark(self): print('%s会叫' %self.name) class Dog(Animal): pass class Cat(Animal): pass dog=Dog("小黄") dog.bark() cat = Cat("伊丽莎白") cat.eat() #继承二:但是猫和狗的叫声不同,所以常用的是接口继承(父类只提供一个规范,子类在调用时需要实现这些规范) # 如果是抽象方法,子类必须实现 import abc class Animal(metaclass=abc.ABCMeta): def __init__(self,name): self.name=name @abc.abstractclassmethod def eat(self): print('%s会吃' %(self.name)) def bark(self): print('%s会叫' %self.name) class Dog(Animal): def bark(self): print('%s会汪汪叫' %self.name) #如果是抽象方法,子类必须实现 def eat(self): pass class Cat(Animal): def eat(self): print('%s会吃鱼儿' %self.name) dog=Dog("小黄") dog.bark() cat = Cat("伊丽莎白") cat.eat()
4.1 继承顺序
当类是经典类(class C1:)时,多继承情况下,深度优先(依次找到根节点)
当类是新式类(class C1(object):)时,多继承情况下,广度优先(最后一次才找到根节点)
原理:python会计算一个方法解析顺序(MRO)列表,可通过print(类名.__mro__)查看