面向对象这种编程的范式每个语言都是通用的,这里总结一下python的面向对象语法,主要包含以下几个方面!

1 基本语法

# 定义类
class Person(object):
n = 10 # 类变量,所有实例共享
# 构造方法,self为创建的实例本身,即hou,yao等
def __init__(self, name, sex, age = 25): # 指定默认属性,可不传
self.name = name # 实例变量,属于实例
self.sex = sex
self.age = age
# self为调用实例本身
def work(self):
print("%s 的年龄是 %s,性别%s,正在工作" % (self.name, self.age, self.sex))
def eat(self, food):
print("{NAME} 吃了 {FOOD}".format(NAME=self.name, FOOD=food))
# 实例类的对象
hou = Person("侯征", "男", 30)
print(Person.n) # 10
print(hou.n) # 10,会先从实例变量中找,找不到再去类变量找
hou.n = 30
print(hou.n) # 30
yao = Person("姚振", "女")
he = Person("何毅", 1)
# 调用类的函数时,python会自动把调用者传递到参数中,即 Person.work(hou)
hou.work()
yao.work()
he.eat("肉夹馍")

  

2 实例变量与私有变量

class Dog(object):
master = "侯征" # 类变量,属于类
def __init__(self, name):
# 实例变量,属于实例
self.name = name
def bite(self, someone):
print("%s 的狗要咬%s了" %(self.master, someone))
# 对象销毁时候执行 del 实例 或者 程序停止
def __del__(self):
print(self.name+"died")
yao = Dog("姚振")
print(Dog.master)
# 实例可直接使用类变量,会先从实例变量找,没有去类变量找
print(yao.master)
yao.master = "何毅" # 覆写类变量,在实例中创建一个新变量进行赋值,不会改变类变量
print(yao.master)
del yao.master
print(yao.master)
yao.age = 12 # 添加新属性
print(yao.age)

  

3 私有属性与私有方法

class Cat(object):
def __init__(self, name, age):
self.name = name
# 前面加__声明属性为私有属性,只能内部函数访问
self.__age = age def eat(self):
# 内部可以访问私有属性
print("%s吃东西,它今年%s岁" % (self.name,self.__age))
# 可以执行私有方法
self.__slepp() # 前面加__ 声明方法为私有方法
def __slepp(self):
print("%s 睡觉" % self.name)
cat = Cat("小花",5)
# print(cat.__age) 无法直接访问
cat.eat()

  

4 继承

# 父类
class Person(object):
def __init__(self, name, age):
self.name = name
self.age = age
def eat(self):
print("%s 吃饭" %self.name)
# 继承Person类
class Man(Person):
def __init__(self, name, age, goatee):
super().__init__(name, age) # 调用父类构造方法
# Person.__init__(self, name, age)
# 添加新的属性
self.goatee = goatee
# 添加新的方法
def playgame(self):
print("打游戏")
class Woman(Person):
# 添加自己方法
def watchShow(self):
print("看电视")
# 覆写父类方法
def eat(self):
super().eat() # 调用父类方法
print("%s 还要吃减肥餐"%self.name)
m1 = Man("heyi", 25, 2)
print(m1.name)
m1.eat() # 可直接调用父类方法,已继承
w1 = Woman("yaozhen",25)
w1.eat()

  

5 多态

# 多态
class Animal(object):
def __init__(self, name): # Constructor of the class
self.name = name
def talk(self): # Abstract method, defined by convention only
raise NotImplementedError("Subclass must implement abstract method")
class Cat(Animal):
def talk(self):
print('%s: 喵喵喵!' % self.name)
class Dog(Animal):
def talk(self):
print('%s: 汪!汪!汪!' % self.name)
def func(obj): # 一个接口,多种形态
obj.talk() # 传入哪个对象,调用那个对象的方法
c1 = Cat('小晴')
d1 = Dog('李磊')
func(c1)
func(d1)

  

6 静态方法,类方法,属性方法

# 静态方法
class Person(object):
type = "中国人"
def __init__(self, name):
self.name = name
@staticmethod # 静态方法装饰器
def eat(self):
print("调用静态方法,%s" %self.name)
@classmethod # 类方法装饰器
def run(self):
# 类方法只能访问类属性,无法访问实例属性
print("调用类方法,类属性:%s" %self.type)
@property # 属性方法装饰器
def do(self):
self.eat(self)
self.run()
person = Person("侯征")
person.do # 属性方法只能直接调用,不需要()
person.run()
# 调用静态方法时,不会把自身当做实例自动传递,需要手动添加实例
person.eat(person)

  

7 特殊方法

# 类的特殊成员方法
class Person(object):
""" 这是一个描述人的python类 """
age = 25
def __init__(self, name):
self.name = name
# 想调用需要定义
def __call__(self, *args, **kwargs):
print("-----")
p = Person("houzheng")
# 类的描述信息
print(p.__doc__)
# 表示当前操作的对象在那个模块
print(p.__module__)
# 表示当前操作的对象的类是什么
print(p.__class__) # <class '__main__.Person'>
p() # 需要在类中定义
print(p.__dict__) # 实例调用返回实例属性 {'name': 'houzheng'}
print(Person.__dict__) # 类调用返回类属性和所有方法
print(p.__str__) # 打印方法,即 toString,可覆写

  

8 反射

# 反射
class Foo(object):
def __init__(self):
self.name = 'wupeiqi'
def func(self):
return 'func'
obj = Foo()
# #### 检查是否含有成员 ####
hasattr(obj, 'name')
hasattr(obj, 'func')
# #### 获取成员 ####
getattr(obj, 'name')
getattr(obj, 'show')
# #### 设置成员 ####
setattr(obj, 'age', 18)
# 可以设置方法
setattr(obj, 'show', lambda num: num + 1)
# #### 删除属性,不能删除方法 ####
delattr(obj, 'name')
print(obj.show(2))

  

总结---Python中的面向对象!的更多相关文章

  1. 22.python中的面向对象和类的基本语法

    当我发现要写python的面向对象的时候,我是踌躇满面,坐立不安呀.我一直在想:这个坑应该怎么爬?因为python中关于面向对象的内容很多,如果要讲透,最好是用面向对象的思想重新学一遍前面的内容.这个 ...

  2. 面向对象相关概念与在python中的面向对象知识(魔法方法+反射+元类+鸭子类型)

    面向对象知识 封装 封装的原理是,其成员变量代表对象的属性,方法代表这个对象的动作真正的封装是,经过深入的思考,做出良好的抽象(设计属性时用到),给出“完整且最小”的接口,并使得内部细节可以对外透明( ...

  3. python中的面向对象编程

    在python中几乎可以完成C++里所有面向对象编程的元素. 继承:python支持多继承: class Derived(base1, base2, base3): pass 多态:python中的所 ...

  4. 2019-04-15 Python中的面向对象学习总结

    一.面向对象总结: (1)三要素:封装,继承,多态                                       详细介绍链接:https://www.jianshu.com/p/68a ...

  5. Python 中的面向对象和异常处理

    在之前我们已经说过了 Python 中内置的主要的几种对象类型,(数,字符串,列表,元组和字典).而面向对象的核心人物还没出场呢 .那么我们常说的对象是什么类型的呢,其实他的类型就是“类”.继承封装和 ...

  6. 第四章 python中的面向对象设计

    一.首先来理解几个面向对象的关键特性: 1.封装:对象可以将他们的内部状态隐藏起来.python中所有特性都是公开可用的. 2.继承:一个类可以是一个或多个类的子类.python支持多重继承,使用时需 ...

  7. python中的面向对象和面向过程

    一.面向对象和面向过程 一.什么是面向过程 核心是过程二字:面向过程是一种流水线的工作流程,是先做什么在做什么 二.什么是面向对象 核心 是对象二字:是一种编程思想,上帝思维,一切皆对象,编程中负责调 ...

  8. Python 中的面向对象编程

    面向对象编程(Object-oriented programming, OOP)是一种基于对象概念的编程范式,可包含属性(attribute)形式的数据以及方法(method)形式的代码.另一种对 O ...

  9. python学习之【第十七篇】:Python中的面向对象(类和对象)

    1.什么是类和类的对象? 类是一种数据结构,我们可以用它来定义对象,后者把数据值和行为特性融合在一起,类是现实世界的抽象的实体以编程形式出现.实例是这些对象的具体化.类是用来描述一类事物,类的对象指的 ...

  10. Java和python中的面向对象

    Python与Java中的示例类 Java类是在与类同名的文件中定义的.因此,必须将该类保存在一个名为Car.java的文件中.每个文件中只能定义一个类. public class Car { pri ...

随机推荐

  1. Linux下C语言编程基础学习记录

    VIM的基本使用  LINUX下C语言编程 用gcc命令编译运行C语言文件 预处理阶段:将*.c文件转化为*.i预处理过的C程序. 编译阶段:将*.i文件编译为汇编代码*.s文件. 汇编阶段:将*.s ...

  2. Android map转json格式,附上Jackson包下载地址,导入过程

    android中的map转json,需要下载jackson包,下载地址: http://www.java2s.com/Code/Jar/j/Downloadjacksonall199jar.htm 下 ...

  3. final评论1

    1-约跑APP 小组准备的非常的充分,还带了摄像头,发布过程清晰.团队的约跑项目界面相较于Beta版本进行了美化,增加了背景图片,使项目看起来更美观.同时项目支持聊天信息的接收和发送,个人觉得他们组的 ...

  4. php排序学习之-冒泡排序

    原理:对一组数据,比较相邻数据的大小,将值小数据在前面,值大的数据放在后面.   (以下都是升序排列,即从小到大排列) 举例说明: $arr = array(6, 3, 8, 2, 9, 1); $a ...

  5. OneZero第五周第一次站立会议(2016.4.18)

    1. 时间: 13:00--13:15  共计15分钟. 2. 成员: X 夏一鸣 * 组长 (博客:http://www.cnblogs.com/xiaym896/), G 郭又铭 (博客:http ...

  6. 第六周 可执行代码 以及 PSP 燃尽图 等等

    转眼已经第六周了.这周主要内容有下:(CHECKLIST) 1.完成未完成的功能点. 2.PSP. 3.站立会议. 4.燃尽图. 5.各种图(折线,饼图). 6.checkList 具体任务如下: 1 ...

  7. java的属性只能在类里面 方法外面定义

    java的属性只能在类里面 方法外面定义 区别于python:python 既能在类里面(类属性) 又能在方法里面定义属性(实例属性)

  8. BZOJ5461 PKUWC2018Minimax(概率期望+线段树合并+动态规划)

    离散化后,容易想到设f[i][j]为i节点权值为j的概率,不妨设j权值在左子树,则有f[i][j]=f[lson][j](pi·f[rson][1~j]+(1-pi)·f[rson][j~m]). 考 ...

  9. Spring点滴八:Spring注入集合

    在Spring中我们通过value属性来配置基本数据类型,通过标签的ref属性来配置对象的引用.这两种情况只能给bean传递一个值,那么如何传递多个值呢?Spring提供了四种Collection类型 ...

  10. 【BZOJ2257】[JSOI2009]瓶子和燃料(数论)

    [BZOJ2257][JSOI2009]瓶子和燃料(数论) 题面 BZOJ 洛谷 题解 很明显就是从\(n\)个数里面选\(K\)个数让他们的\(gcd\)最大. 暴力找所有数的因数,拿个什么东西存一 ...