我的Python分析成长之路7
类
一、编程范式:
1.函数式编程 def
2.面向过程编程 (Procedural Programming)
基本设计思路就是程序一开始是要着手解决一个大的问题,然后把一个大问题分解成很多个小问题或子过程,这些子过程再执行的过程再继 续分解直到小问题足够简单到可以在一个小步骤范围内解决。
3.面向对象编程 (object oriented programming)
OOP编程是利用“类”和“对象”来创建各种模型来实现对真实世界的描述,使用面向对象编程的原因一方面是因为它可以使程序的维护和扩 展变得更简单,并且可以大大提高程序开发效率 ,另外,基于面向对象的程序可以使它人更加容易理解你的代码逻 辑,从而使团队开发变得更从容。
![](https://images.cnblogs.com/OutliningIndicators/ContractedBlock.gif)
1 #面向对象编程 2 class Dog(): 3 '''一次小狗的简单模拟类''' 4 def __init__(self,name,age): 5 self.name = name 6 self.age = age 7 def eating(self,food): 8 '''模拟小狗吃东西''' 9 print("%s is eating %s"%(self.name,food)) 10 def running(self): 11 '''模拟小狗跑步''' 12 print("%s is running "%self.name) 13 def main(self): 14 self.eating("apple") 15 self.running() 16 if __name__ == "__main__": 17 dog1 = Dog("xiaoming",3) 18 dog1.main()
1.方法__init__():初始化函数,每当实例化类时,python就会自动运行该函数。调用该函数时,会自动传递实参self,它是一个指向实例本身的引用,让实例能访问类中的 属性和方法.__init__()函数中需要的参数,就是实例化类时需要传递的参数
2. 其他方法:通过实例来调用该方法
3.类属性和实例属性 调用时用.调用 类方法也通过.来调用
![](https://images.cnblogs.com/OutliningIndicators/ContractedBlock.gif)
1 class Car(): 2 name = "Ryoma" 3 '''一次汽车的简单模拟类''' 4 def __init__(self,make,model,year): 5 '''汽车的属性''' 6 self.make = make 7 self.model = model 8 self.year = year 9 self.odometer_ing = 0 10 def get_describe(self): 11 '''车的描述''' 12 print(str(self.make)+' '+str(self.model)+' '+str(self.year)) 13 def read_odometer(self): 14 '''读里程表''' 15 print("this car has "+str(self.odometer_ing)+' '+"miles ") 16 def update_odometer(self,miles): 17 '''更新里程表的数''' 18 self.odometer_ing += miles 19 car = Car("AUDI",'A6',1995) 20 car.update_odometer(100) 21 print(car.odometer_ing) 22 car.read_odometer()
二、类的三大特性
1.封装
封装也就是把客观事物封装成抽象的类,并且类可以把自己的数据和方法只让可信的类或对象操作,对不可信的进行信息隐藏
2.继承
继承是指这样一种能力,它可以使用现有类的所有功能,并在无需重新编写原来类的情况下对这些功能进行扩展。
通过继承创建的类为“子类”或“派生类”。被继承的类称为“父类”或“基类”。
继承实现的方式主要有两种:实现继承、接口继承。实现继承指的是使用基类的属性或方法而无需额外的编码能力。接口继承指使用属性和方法的名称, 但是子类必须提供实现的能力(即重构父类的方法)
![](https://images.cnblogs.com/OutliningIndicators/ContractedBlock.gif)
1 class Car(): 2 def __init__(self,make,model,year,fill_gas=100): 3 '''汽车的属性''' 4 self.make = make 5 self.model = model 6 self.year = year 7 self.odometer_ing = 0 8 self.fill_gas = 100 9 def get_describe(self): 10 '''车的描述''' 11 print(str(self.make)+' '+str(self.model)+' '+str(self.year)) 12 def read_odometer(self): 13 '''读里程表''' 14 print("this car has "+str(self.odometer_ing)+' '+"miles ") 15 def update_odometer(self,miles): 16 '''更新里程表的数''' 17 self.odometer_ing += miles 18 def fill_gas_tank(self): 19 print("this var has %s "%self.fill_gas) 20 class ElectricCar(Car): 21 '''创建一个电动车的模拟类''' 22 def __init__(self,make,model,year): 23 super(ElectricCar,self).__init__(make,model,year) 24 self.battery = Battery() 25 def fill_gas_tank(self): 26 print("this car has no fill_gas") 27 class Battery(): 28 '''一次对电池的简单模拟''' 29 def __init__(self,battery_size=70): 30 self.battery_size = battery_size 31 def describe_battery(self): 32 print("this battery size is %s"%self.battery_size) 33 ecar = ElectricCar('tesla','s',2000) 34 ecar.battery.describe_battery()
![](https://images.cnblogs.com/OutliningIndicators/ContractedBlock.gif)
1 class Company(): 2 def __init__(self,name,addr,found_year): 3 self.name = name 4 self.addr = addr 5 self.found_year = found_year 6 def tell(self): 7 print("公司名为%s,地址是%s,成立于%s"%(self.name,self.addr,self.found_year)) 8 def roll_member(self): 9 print("\033[31;1m%s正在招人才,大家可以投简历\033[0m"%self.name) 10 class CompanyMember(): 11 members =0 12 def __init__(self,name,age): 13 self.name = name 14 self.age = age 15 def roll_member(self): 16 CompanyMember.members += 1 17 print("\033[41;1m %s 已被录用,现在公司人数为%s\00[0m"%(self.name,self.members)) 18 class Leader(CompanyMember): 19 def __init__(self,name,age,salary): 20 super(Leader,self).__init__(name,age) 21 self.salary = salary 22 self.roll_member() 23 def job(self): 24 print("%s的工作是CEO"%self.name) 25 def tell_info(self): 26 print("my name is %s,age is %s"%(self.name,self.age)) 27 class Putonh(CompanyMember): 28 def __init__(self,name,age): 29 super(Putonh,self).__init__(name,age) 30 self.roll_member() 31 def tell_info(self): 32 print("my name is %s,age is %s"%(self.name,self.age)) 33 if __name__ == "__main__": 34 company = Company("Ryoma Fintech","hangzhou",2020) 35 company.tell() 36 company.roll_member() 37 led = Leader('zqq',24,200000) 38 led.tell_info() 39 led.job() 40 pu = Putonh('a',18) 41 pu.tell_info()
继承主要有两种继承方式:1.在python2.7经典类中是深度优先继承 2.在2.7新式类中是广度优先继承3.在3.x中都是广度优先
![](https://images.cnblogs.com/OutliningIndicators/ContractedBlock.gif)
1 class A(object): 2 def __init__(self): 3 print("in the A") 4 class B(A): 5 def __init__(self): 6 print("in the B") 7 class C(A): 8 def __init__(self): 9 print("in the C") 10 class D(B,C): 11 # def __init__(self): 12 # print("in the D") 13 pass 14 D()
3.多态
允许你将父对象设置成为和一个或多个子对象相同的技术,赋值之后,父对象就可以根据当前赋值给它的子对象的特性以不同的方式运行,为了实现接口 重用。
![](https://images.cnblogs.com/OutliningIndicators/ContractedBlock.gif)
1 class Animal(): 2 def __init__(self,name): 3 self.name = name 4 def talk(self): 5 raise NotImplementedError("Subclass must implement abstract method") 6 7 class Cat(Animal): 8 def talk(self): 9 print("喵喵喵") 10 class Dog(Animal): 11 def talk(self): 12 print("WOw") 13 def func(obj): 14 obj.talk() 15 if __name__ == '__main__': 16 c1 = Cat('dd') 17 d1 = Dog("xx") 18 func(c1) 19 func(d1) #一个接口,多种实现
![](https://images.cnblogs.com/OutliningIndicators/ContractedBlock.gif)
1 class Animal(): 2 def __init__(self,name): 3 self.name = name 4 def talk(self): 5 raise NotImplementedError("Subclass must implement abstract method") 6 @staticmethod 7 def animal_talk(obj): 8 obj.talk() 9 class Cat(Animal): 10 def talk(self): 11 print("喵喵喵") 12 class Dog(Animal): 13 def talk(self): 14 print("WOw") 15 16 if __name__ == '__main__': 17 c1 = Cat('dd') 18 d1 = Dog("xx") 19 Animal.animal_talk(c1) 20 Animal.animal_talk(d1)
三、静态方法 @staticmethod 实际上让方法变成与类没关系,变成类下的一个方法,不要传self
四、类方法 @classmethod 只能调用类属性,不能访问实例属性
五、静态方法@property 1.将方法变为静态属性,调用时直接实例+方法名,不加括号
六、其他特殊成员方法
1.__doc__ 表示类的描述信息
2.__module__表示当前操作的对象在哪个模块
3.__class__表示当前操作的类是哪个
4.__init__构造函数,通过类创建对象时,自动触发
5.__del__析构函数,当对象在内存中释放的时候,自动触发
6.__call__对象后面加(),触发执行,或类()()
7.__dict__查看类或对象的所有属性,类.__dict__只能查看类中的属性,对象.__dict__只能查看对象中的属性。
8.__getitem__ /__setitem__/__delitem__用于索引操作,分别对应获得,设置,删除操作
![](https://images.cnblogs.com/OutliningIndicators/ContractedBlock.gif)
1 def tell(self): 2 print("my name is %s"%self.name) 3 class Foo(object): 4 def __init__(self): 5 self.name = 'zz' 6 def func(self): 7 return 'func' 8 foo = Foo() 9 print(hasattr(foo,'name')) #判断是否有名字属性 10 print(hasattr(foo,'func')) #判断是否有func方法 11 print(getattr(foo,'name')) #获得name属性的值 12 print(getattr(foo,'func')) #获得func对应的函数地址 13 setattr(foo,"age",18) #设置成员函数 14 setattr(foo,"tell",tell) 15 print(getattr(foo,'age')) 16 fuc = getattr(foo,"tell") 17 fuc(foo) 18 delattr(foo,"name") #删除成员函数