面向过程:根据业务逻辑从上到下写代码

面向对象:将数据与函数绑定在一起,进行封装,优点:快速高效 ,减少代码重写

面向对象三大特性:封装、继承、多态

# 封装的意义,隐藏实现细节
将属性和方法放到一起做为一个整体,然后通过实例化对象来处理;
隐藏内部实现细节,只需要和对象及其属性和方法交互就可以了;
对类的属性和方法增加 访问权限控制。
# 继承的意义,代码复用
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

最新文章

  1. 汉字正则表达式[\u4E00-\u9FFF]原因
  2. Uiautomator 2.0之BySelector类学习小记
  3. struts.xml 配置详解
  4. Linux-IP地址后边加个/8(16,24,32)是什么意思?
  5. seajs第二节,seajs各模块依赖关系
  6. Android开发视频学习(2)
  7. undefined 和 null 的异同
  8. flashback database操作步骤
  9. c#学习已经停止了
  10. Android原生APP内分享
  11. linux下nginx负载均衡部署
  12. MySQL两个最简单的delimiter的使用demo
  13. 【学习】js学习笔记:数组(一)
  14. 【微信小程序开发】快速开发一个动态横向导航模板并使用
  15. 计算机网络基础——OSI七层网络模型
  16. UVA - 10917 - Walk Through the Forest(最短路+记忆化搜索)
  17. SpringBoot整合RabbitMQ-服务安装
  18. spring+springmvc+ibatis整合注解方式实例【转】
  19. sql leetcode -Duplicate Emails
  20. openstack新版本ocata的接口改动

热门文章

  1. SpringCloud之Ribbon:负载均衡
  2. 安装oracle11g服务端
  3. Objective-C中 #include 和 #import 的区别
  4. ElementPath
  5. java并发编程-12个原子类
  6. Css 设置固定表格头部,内容可滚动
  7. eclipse_neon 的Spket 目录下只有一个Task Tags,没有其他的选项,导致没有办法添加提示文件! 添加sdk文件之后还是没有办法显示的解决办法
  8. ETCD:TLS
  9. 查看Linux服务器CPU总核数
  10. ASP.NET Core Web 应用程序系列(一)- 使用ASP.NET Core内置的IoC容器DI进行批量依赖注入(MVC当中应用)