新式类与旧式类

区别:

  1. 在2.2版本之前所有的类都是旧式类,3.x版本已取消旧式类
  2. 旧式类一般的写法,不继承任何父类
class Person:
def __init__(self, name):
self.name = name
  1. 在旧式类中,子类不能通过super函数来调用父类的函数
class Student(Person):
def __init__(self, name):
print('初始化Student类')
# 如果在2.x版本中运行以下函数执行的时候将会报错,3.x版本中已取消旧式类,使用以下方法可以正常执行
# super(Student, self).__init__(name)
# 在旧式类中需要通过以下形式来调用父类中的参数
# Person.__init__(self,name) print(type(s1)) # 如果为新式类该方法则输出Student,如果为旧式类该方法则输出instance

继承

重写父类方法

class Person(object):  # 父类

    def __init__(self, name, age):
self.name = name
self.age = age def eat(self):
print('人在吃饭') def greet(self):
print('你好,我是%s,我今年%d岁了!' % (self.name, self.age)) class Student(Person): # 子类 def __init__(self, name, age):
super(Student, self).__init__(name, age)
print('初始化一个学生') def eat(self): # 重写eat方法
print('学生在吃饭') p = Student('tangwenjie', 18)
p.greet()
p.eat() # 输出:学生在吃饭 执行顺序:当前类>父类

私有属性与方法

子类无法继承父类的私有方法与属性(变量或方法名前有两个下划线的方法或属性),但可以继承父类受保护的方法与属性(变量或方法名前有一个下划线的方法或属性)

class Person(object):

    def __init__(self, name):
self.__name = name def __greet(self):
print('你好,我叫%s' % self.__name) class Student(Person): def greet(self):
self.__greet() def eat(self):
print(self.__name + '在吃饭') s1 = Student('ywj')
s1.greet() # 报错'Student' object has no attribute '_Student__greet'
s1.eat() # 报错'Student' object has no attribute '_Student__name'

多继承

  1. 多继承的情况下天然拥有多个父类的方法
  2. 如果当前类与多个父类存在相同的方法时,执行的优先级是当前类的方法>位置靠前的父类的方法,具体顺序可通过类名.__mro__方法查询,且通过super的方式的执行顺序也是这样的
  3. 如果要指定执行某一个父类中的方法可以在当前类中通过指定父类.func(self)的方式实现
class Ma(object):
def run(self):
print('马在奔跑') def eat(self):
print('马在吃草') class Lv(object):
def lamo(self):
print('驴在拉磨') def eat(self):
print('驴在吃麦秆') class Luozi(Lv, Ma):
# def eat(self):
# print('骡子在吃稻谷')
pass lz = Luozi()
# 多继承的情况下天然拥有多个父类的方法
# lz.run()
# lz.lamo()
# 如果当前类与多个父类存在相同的方法时,执行的优先级是当前类的方法>位置靠前的父类的方法,具体顺序可通过如下方法查询,且通过super的方式的执行顺序也是这样的
# print(Luozi.__mro__)
# 如果要指定执行某一个父类中的方法可以在当前类中通过Lv.eat(self)的方式实现
# lz.eat()

多态

强类型语言:在声明一个变量时需要指定其类型,例如java、c++

弱类型语言:即不需要在指定一个变量时指定其类型,例如python

class Hero(object):
def __init__(self):
pass def stroke(self):
pass class Chengyaojin(Hero):
def stroke(self):
print('程咬金的大招') class Xiangyu(Hero):
def stroke(self):
print('项羽的大招') h = input('请输入你想选择的英雄')
hero = None if h == '1':
hero = Chengyaojin()
else:
hero = Xiangyu() hero.stroke()

类属性和实例属性

实例属性:绑定到对象上的属性,只能在当前对象上使用

类属性:

  1. 可以通过实例进行访问,也可以直接通过类进行访问
  2. 如果通过实例修改类属性,实际上并没有真正修改类属性,而是在这个实例上面重新定义了一个名字相同的实例属性
  3. 要正确修改类属性只能通过类名.属性的方式来进行修改
class Person(object):
country = 'china' # 类属性
def __init__(self, name):
self.name = name # 实例属性

类方法和实例方法

实例方法:只能通过实例.func()进行调用,需要传递self(当前实例)参数

类方法:可以通过类名.func()实例.func()进行调用,需要传递cls(当前类)参数

静态方法:可以通过类名.func()实例.func()进行调用,不需要传递参数

class Person(object):

    def eat(self): # 实例方法,传递当前实例
print('实例方法') @classmethod
def greet(cls): # 类方法,传递当前类
print('类方法') @staticmethod # 静态方法,不需要传递任何参数
def static_method():
print('静态方法')

__new__方法

  1. 一个实例被新建时会首先执行这个类的__new__方法来创建这个实例,再调用__init__方法初始化个对象的属性
  2. __new__方法接收当前类与其他任意参数并返回被创建的这个对象
  3. 所以如果在定义类的时候重写了__new__方法,则必须要在这个方法最后返回当前这个类的对象
class Car(object):
def __new__(cls, *args, **kwargs):
print('new method')
return super(Car, cls).__new__(cls, *args, **kwargs) def __init__(self):
print('car init method') car = Car() # 输出:new method
print(car) # 输出:car init method

单例设计模式

单例:某个类或者模型在整个程序运行期间最多只能有一个对象被创建

使用场景:比如一个项目中有一个配置文件,那么可以通过定义一个Config的类来操作配置信息,但是配置信息在整个项目中其实只需要一份就够了,这时候就可以使用到单例模式了。

实现方法:该方式实现单例在多线程的情况下并不安全

class User(object):

    # 1. 定义一个类属性默认值为None
__instance = None # 2. 重写__new__方法
def __new__(cls, *args, **kwargs):
# 3.在创建实例前判断当前类中是否已经存在实例,如果不存在则创建实例
if not cls.__instance:
cls.__instance = super(User, cls).__new__(cls)
# 5.如果存在,则返回当前实例
return cls.__instance def __init__(self, name):
self.name = name

Python进阶之面向对象的更多相关文章

  1. python进阶01 面向对象、类、实例、属性封装、实例方法

    python进阶01 面向对象.类.实例.属性封装.实例方法 一.面向对象 1.什么是对象 #一切皆对象,可以简单地将“对象”理解为“某个东西” #“对象”之所以称之为对象,是因为它具有属于它自己的“ ...

  2. Python进阶(十三)----面向对象

    Python进阶(十三)----面向对象 一丶面向过程编程vs函数式编程vs面向对象编程 面向过程: ​ 简而言之,step by step 一步一步完成功能,就是分析出解决问题所需要的步骤,然后用函 ...

  3. Python进阶之面向对象编程

    面向对象编程——Object Oriented Programming,简称OOP,是一种程序设计思想.OOP把对象作为程序的基本单元,一个对象包含了数据和操作数据的函数. 面向过程的程序设计把计算机 ...

  4. Python进阶之面向对象编程(二)

    Python面向对象编程(二) .note-content {font-family: "Helvetica Neue",Arial,"Hiragino Sans GB& ...

  5. Python进阶之面向对象编程概述

    Python面向对象编程(一) .note-content {font-family: "Helvetica Neue",Arial,"Hiragino Sans GB& ...

  6. Python 进阶_OOP 面向对象编程_组合与继承

    #目录 前言 组合 派生 通过继承来覆盖重载方法 最常用的重载场景实例方法的重载 从标准类中派生类方法的重载 前言 我们定义一个类是希望能够把类当成模块来使用,并把类嵌入到我们的应用代码中,与其他的数 ...

  7. Python进阶-XIV 面向对象初步

    1.面向对象的引入 def Person(*args): ''' 定义一个人 :param args: 人的属性 :return: 人的所有属性的字典 ''' info = {} info['name ...

  8. Python进阶编程 面向对象

    一.面向对象 1.1面向对象的基本格式 class 类名: def 方法名(self): print(123) return 123 def 方法名(self): print(123) return ...

  9. Python 进阶_OOP 面向对象编程_self 的实例绑定

    目录 目录 self 和绑定 调用非绑定的方法 self 和绑定 在 Python 中 self 变量是特殊的, 其用于在实例方法中引用该方法所绑定的实例, 换句话说就是 Python 在实例化对象时 ...

随机推荐

  1. P1197 [JSOI2008]星球大战[并查集+图论]

    题目来源:洛谷 题目描述 很久以前,在一个遥远的星系,一个黑暗的帝国靠着它的超级武器统治着整个星系. 某一天,凭着一个偶然的机遇,一支反抗军摧毁了帝国的超级武器,并攻下了星系中几乎所有的星球.这些星球 ...

  2. Mybatis容易遇到的问题

    1.MyBatis中#和$的区别? 1.使用#的原理是?占位符,而$的原理为直接字符串拼接方式 2.$方式一般使用在写数据库中的固定字段时候才会使用例如表名或者列名(select * from use ...

  3. ZOJ - 3157:Weapon (几何 逆序对)

    pro:给定平面上N条直线,保证没有直线和Y轴平行. 求有多少交点的X坐标落在(L,R)开区间之间,注意在x=L或者R处的不算. sol:求出每条直线与L和R的交点,如果A直线和B直线在(L,R)相交 ...

  4. 【模板】A*B Problem(FFT快速傅里叶)

    题目:给出两个n位10进制整数x和y,你需要计算x*y.($n \leq 60000$) 分析: 两个正整数的相乘可以视为两个多项式的相乘, 例如 $15 \times 16 = 240$, 可写成 ...

  5. P1071 潜伏者

    //Pro:NOIP2009 T1 P1071 潜伏者 #include<iostream> #include<cstdio> #include<cstring> ...

  6. 第12组 Alpha冲刺(4/6)

    Header 队名:To Be Done 组长博客 作业博客 团队项目进行情况 燃尽图(组内共享) 由于这两天在修bug,燃尽图没有下降 展示Git当日代码/文档签入记录(组内共享) 注: 由于Git ...

  7. 梯度裁剪(Clipping Gradient):torch.nn.utils.clip_grad_norm

    torch.nn.utils.clip_grad_norm_(parameters, max_norm, norm_type=2) 1.(引用:[深度学习]RNN中梯度消失的解决方案(LSTM) ) ...

  8. hdu1702 ACboy needs your help again![简单STL 栈 队列]

    目录 题目地址 题干 代码和解释 参考 题目地址 hdu1702 题干 代码和解释 本题很简单,只要掌握STL stack和STL vector的语法即可作答.记录本题是为了记录STL vector的 ...

  9. 第09组 Alpha冲刺(2/4)

    队名:软工9组 组长博客:https://www.cnblogs.com/cmlei/ 作业博客:http://edu.cnblogs.com/campus/fzu/SoftwareEngineeri ...

  10. Unity创作赛车游戏的四款插件

    本文,我们将介绍其中4款:Racing Game Starter Kit.GeNa 2 .NWH Vehicle Physics.Curvy Splines. Racing Game Starter ...