python--基础知识点梳理(二)面向对象
面向过程:根据业务逻辑从上到下写代码
面向对象:将数据与函数绑定在一起,进行封装,优点:快速高效 ,减少代码重写
面向对象三大特性:封装、继承、多态
# 封装的意义,隐藏实现细节 将属性和方法放到一起做为一个整体,然后通过实例化对象来处理; 隐藏内部实现细节,只需要和对象及其属性和方法交互就可以了; 对类的属性和方法增加 访问权限控制。
# 继承的意义,代码复用 1. 一个类可以派生出子类,在这个父类里定义的属性、方法自动被子类继承 2. 比如CS中的警察和恐怖分子,可以将两个角色的相同点写到一个父类中,然后同时去继承它 3. 使用经典类: Person.__init__(self,name,age) 并重写写父类Person的构造方法,实现,先覆盖,再继承,再重构
# 多态的意义 ,接口重用 1.多态是面向对象的重要特性,简单点说:“一个接口,多种实现” 2. 指一个基类中派生出了不同的子类,且每个子类在继承同样的方法名的同时又对父类的方法做了不同的实现 3. 这就是同一种事物表现出的多种形态 4. 比如黄种人继承了人talk这个功能,但是他说的是中文,而美国人的talk是英文,但是他们是同样的talk
class Role(object): #1、在定义类时继承object就是新式类,没有就是就是旧类式 public_object = "public" #2、在类例定义一个公有属性:所有实例都能访问的属性叫“公有属性” def __init__(self,name,role,weapon,life_value=100,money=15000): #构造函数==初始化方法:模板 self.name = name #3、普通属性 self.__heart= "Normal" #4、私有属性在外面无法访问 def shot(self): #5、类的方法 print("%s is shooting..."%self.name) r = Role('zhangsan','boss','gun') r.shot()
类方法、静态方法、属性方法
类方法:是类对象所拥有的方法,需要用修饰器@classmethod来标识其为类方法,对于类方法,第一个参数必须是类对象,一般以cls作为第一个参数(当然可以用其他名称的变量作为其第一个参数,但是大部分人都习惯以'cls'作为第一个参数的名字,就最好用'cls'了),能够通过实例对象和类对象去访问。
类方法:可以通过类对象引用,也可以通过实例对象引用,类对象不访问实例变量
class People(object): # 私有类属性 __country = 'china' #类方法,用classmethod来进行修饰 @classmethod def get_country(cls): return cls.__country @classmethod def set_country(cls,country): cls.__country = country p = People() print(p.get_country()) #可以用过实例对象访问 print(People.get_country()) #可以通过类访问 p.set_country('japan') print(p.get_country()) print(People.get_country())
静态方法:静态方法可以更好的组织代码,防止代码变大后变得比较混乱。静态方法只是名义上归类管理,实际上在静态方法里访问不了类或则实例中的任何属性
静态方法:需要通过修饰器@staticmethod来进行修饰,静态方法不需要多定义参数,可以通过对象和类来访问。
class People(object): country = 'china' @staticmethod #静态方法 def get_country(): return People.country p = People() # 通过对象访问静态方法 p.get_country() # 通过类访问静态方法 print(People.get_country())
属性方法:把一个方法变成一个属性,隐藏了实现细节,调用时不必加括号直接d.eat即可调用self.eat()方法
class Dog(object): def __init__(self, name): self.name = name @property def eat(self): print(" %s is eating" % self.name) d = Dog("xiaolutongxue") d.eat # 调用会出以下错误, 说NoneType is not callable, 因为eat此时已经变成一个静态属性了, # 不是方法了, 想调用已经不需要加()号了,直接d.eat就可以了
公有属性、私有属性、普通属性
# 1. 公有属性:在内存中仅存一份 # 2. 普通属性:每个实例对象在内存存一份 # 3. 私有属性:实例在外部无法调用
单例模式:保证一个类只有一个实例,并提供一个访问它的全局访问点。
优点:对唯一实例的受控访问,相当于全局变量,但是又可以防止此变量被篡改。太多实例对象也会造成资源浪费
# 实例化一个单例 class Singleton(object): __instance = None def __new__(cls,age,name): # 如果类属性的值为None,那么就创建一个对象,并且赋值这个对象的应用,下次调用这个方法时就可以判断已有实例化对象 if not cls.__instance: cls.__instance = object.__new__(cls) return cls.__instance s = Singleton(11,'xiaolu') g = Singleton(13,'xiaolu') print(id(s)) print(id(g))
反射:通过字符串的方式去调用某个函数。
应用:比如在django中的类视图,我们定义了def post或def get就可以直接调用了响应的请求方式,其实底层就是用反射实现。
super()的作用:
# 子类继承了多个父类,如果父类类名修改了,那么子类也要涉及多次修改。而且需要重复写多次调用,显得代码臃肿。 使用super() 可以逐一调用所有的父类方法,并且只执行一次。调用顺序遵循 mro 类属性的顺序。 注意:如果继承了多个父类,且父类都有同名方法,则默认只执行第一个父类的(同名方法只执行一次,目前super()不支持执行多个父类的同名方法) super() 在Python2.3之后才有的机制,用于通常单继承的多层继承。
出处:https://www.cnblogs.com/xiaonq/p/7880547.html#i11