一、OO = Object Oriented 面向对象  

OOP面向对象编程、OOA面向对象分析、OOD面向对象设计

二、属性+方法——>类(数据和函数)

class Turtle():   #类名约定用大写
#属性
color = #方法
def climb(self):
pass
def run(self):
pass tt = Turtle() #创建对象
tt.run() #调用 class Myclass(list):继承list
  pass
list2 = Myclass()
list2.append(4)
list2.append(3)
list2.sort() class A:
  def fun(self):
    print('I am A')
class B:
  def fun(self):
    print('I am B')
a = A()
b = B()
a.fun()
b.fun()#名字一样,打印不一样,就是多态

OOP三大特征:

封装:信息隐蔽技术

继承:子类自动共享父类之间数 据和方法的机制

多态:不同对象对同一方法响应不同的行动

三、self是什么?相当于c++的this指针!

由一个类可以生成无数个对象,当一个对象的方法被调用的时候,对象会把自身作为第一个参数传给self参数,Python就知道是哪个对象在调用方法了。例如:

class Ball():
def setName(self, name):
self.name = name
def kick(self):
print("我叫%s,谁踢我。。。" % self.name) a = Ball()
a.setName('qiu A')
b = Ball()
b.setName('qiu B')
a.kick()
b.kick()    #a对象和b对象个返回个的,正是因为self的帮助

 

四、Python的魔法方法(被双下滑线包围)

__init__(self)构造方法,用于实例化对象传入参数

上边两个例子没有显性声明构造方法,试用默认的无惨__init__()

#coding:utf8
class Ball:
def __init__(self, name):
self.name = name
def kick(self):
print("I am %s, 该死的,谁踢我" % self.name) a = Ball('土豆')
a.kick()
c = Ball() #报错

五、公有和私有

公有变量可以通过点操作符访问

私有变量(名字改编"_类名__变量名"name mangling技术)只需在变量名或函数名前加上“__”两个下划线!此时点name或者点__name都不能访问到(报错),试用getName()

#coding:utf8
class Person:
__name = "liyi"
def getName(self):      #通过方法访问
return self.__name p = Person()
#p.name  报错
#p.__name 报错
p.getName()
p._Person__name             #会访问到liyi

私有方法也是加两个下划线

python:类5——Python 的类的下划线命名有什么不同?

六、继承

1、如果子类中定义与父类同名的方法或属性,则会自动覆盖父类对应的方法或属性

#coding:utf8
class Parent:
def hello(self):
print('父类方法hello')
def func(self):
print('父类方法func')
class Child(Parent):
def func(self):
print('子类方法func,覆盖了父类方法') p = Child()
p.hello()
p.func() [root@CentOS6 ~]# python test.py
父类方法hello
子类方法func,覆盖了父类方法

2、supper()方法

(技术一:调用未绑定的父类方法)调用父类的构造方法(父类点init方法,注意self参数),
                此处的self不是分类的实例对象,而是子类Shark的实例对象,相当于Fish.__init__(Shark),因为被重写了。
(技术二:使用supper函数<更好>):supper函数能自动找到需要的基类的方法,而且还会为我们自动传入self参数
                supper().__init__(),不用给出基类的名字,会自动把所有父类、父父类的方法;所以修改基类名字时,不用一一修改
#coding:utf8
import random as r
class Fish:
def __init__(self):
                self.x = r.randint(0, 10)
self.y = r.randint(0, 10)
def move(self):
self.x -= 1
print("我的位置是:", self.x, self.y) class Goldfish(Fish):
pass
class Carp(Fish):
pass
class Salmon(Fish):
pass
class Shark(Fish):            #定义鲨鱼,除了位置属性还要有个是否饥饿的属性
def __init__(self):       #重写就会覆盖
         Fish.__init__(self) #(技术一:调用未绑定的父类方法)
                       (技术二:使用supper函数<更好>)
self.hungry = True
def eat(self):
if self.hungry:
print("吃货的梦想就是天天有的吃")
self.hungry = False
else:
print("太撑了,吃不下了") g = Goldfish()
s = Shark()
s.eat()
g.move()

3、多重继承:会使语法混乱,尽量不用

class Base1:
pass
class Base2:
pass
class C(Base1, Base2):
pass

七、组合类:把类的实例化放到新类里边(横向关系,继承是纵向关系)

#coding:utf8
把鱼类对象和乌龟类对象放到水池类中
class Turtle:
def __init__(self, x):
self.num = x
class Fish:
def __init__(self, x):
self.num = x
class Pool:
def __init__(delf, x, y):  #传入x个乌龟y个鱼
self.turtle = Turtle(x)
self.fish = Fish(y)
def print_num(self):
print("水池总共有乌龟%d只,小鱼%d条" % (self.turtle.num, self.fish.num)  #这里self.turtle是不对的,必须是self.turtle.num

八、Mix-in机制(鱼c扩展)

pass

九、类、类对象、实例对象:是三个不同的东西!

#coding:utf8
class C:    #类
count = 0
a = C()
b = C()
a.count     #实例对象的count
C.count     #类对象的count
a.count = 10  #a.count返回10 b.count返回0 C.count返回0
C.count = 100 #a.count返回10(因为上一步已经覆盖,看不到上一层) b.count返回100(未覆盖,看到上一层) C.count返回100
对实例对象赋值后,会覆盖掉类对象,而看不到类对象

下边的会覆盖上边的!

十、属性和方法相同,属性会把方法覆盖掉!  

  属性名用名词,方法名用动词


扩展:Python绑定概念

Python严格要求方法需要有实例才能被调用,这种限制其实就是Python所谓的绑定概念。所以需要在方法定义时加上self

bb.__dict__查看实例所拥有的属性

BB.__dict__查看类所拥有的的属性,可以看到方法,会有好多东西,用来跟踪与类相关的值。实例对象会共用,但会被实例属性覆盖;以dict键值对返回

删除类对象后,实例对象(static静态的)依然存在在内存中,只有当程序退出时才会释放。

python:类1——类和对象基础的更多相关文章

  1. python基础——类名称空间与对象(实例)名称空间

    python基础--类名称空间与对象(实例)名称空间 1 类名称空间 创建一个类就会创建一个类的名称空间,用来存储类中定义的所有名字,这些名字称为类的属性 而类的良好总属性:数据属性和函数属性 其中类 ...

  2. python基础之类和对象、对象之间的交互、类名称空间与对象/实例名称空间

    一 面向对象初识 Python要么是面向过程要么是面向对象. 概念及优缺点: 面向过程的程序设计的核心是过程,过程即解决问题的步骤,面向过程的设计就好比精心设计好一条流水线,考虑周全什么时候处理什么东 ...

  3. Python笔记(七):字典、类、属性、对象实例、继承

    (一)  简单说明 字典是Python的内置数据结构,将数据与键关联(例如:姓名:张三,姓名是键,张三就是数据).例如:下面这个就是一个字典 {'姓名': '张三', '出生日期': '2899-08 ...

  4. Python虚拟机类机制之instance对象(六)

    instance对象中的__dict__ 在Python虚拟机类机制之从class对象到instance对象(五)这一章中最后的属性访问算法中,我们看到“a.__dict__”这样的形式. # 首先寻 ...

  5. Python之面向对象类和对象

    Python之面向对象类和对象 定义一个类:class 定义类的语法: class Test(object): """ 类里定义一类事物共同的技能. 可以是变量,也可是函 ...

  6. python中的类,对象,方法,属性等介绍

    注:这篇文章写得很好.加底纹的是我自己的理解 python中一切皆为对象,所谓对象:我自己就是一个对象,我玩的电脑就是对象,坐着的椅子就是对象,家里养的小狗也是一个对象...... 我们通过描述属性( ...

  7. python 零散记录(七)(下) 新式类 旧式类 多继承 mro 类属性 对象属性

    python新式类 旧式类: python2.2之前的类称为旧式类,之后的为新式类.在各自版本中默认声明的类就是各自的新式类或旧式类,但在2.2中声明新式类要手动标明: 这是旧式类为了声明为新式类的方 ...

  8. Python 面向对象(创建类和对象,面向对象的三大特性是指:封装、继承和多态,多态性)

    概念:                                                                                                 ...

  9. Python里的类和对象简介

    ---恢复内容开始--- Python里的类  对象=属性+方法: 对象的属性主要是指主要的特征和参量,而方法主要是指函数: 类是一个具有一定特征和方法的集合,而对象是类的一个:类和对象的关系就如同模 ...

随机推荐

  1. mycat+mysql搭建高可用集群1--垂直分库

    mycat垂直分库 本文主要介绍了如何使用mycat对mysql数据库进行垂直分库,包括: 垂直分库的步骤 垂直分库的环境准备 配置mycat垂直分库 1. 垂直分库的步骤 收集分析业务模块间的关系 ...

  2. 【Autofac打标签模式】Component和Autowired

    [ Autofac打标签模式]开源DI框架扩展地址: https://github.com/yuzd/Autofac.Annotation/wiki Componet标签把类型注册到DI容器 1. 把 ...

  3. CodeForces - 1214D B2. Books Exchange (hard version)

    题目链接:http://codeforces.com/problemset/problem/1249/B2 思路:用并查集模拟链表,把关系串联起来,如果成环,则满足题意.之后再用并查集合并一个链,一个 ...

  4. React + MobX 状态管理入门及实例

    前言 现在最热门的前端框架,毫无疑问是React. React是一个状态机,由开始的初始状态,通过与用户的互动,导致状态变化,从而重新渲染UI. 对于小型应用,引入状态管理库是"奢侈的&qu ...

  5. hdfs 文件系统命令操作

    hdfs 文件系统命令操作 [1]hdfs dfs -ls [目录]. 显示所有文件 hdfs dfs -ls -h /user/20170214.txt 显示文件时,文件大小以人易读的形式显示 [2 ...

  6. redis集群之Codis

    在大数据高并发场景下,单个 Redis 实例往往会显得捉襟见肘.首先体现在内存上,单个 Redis 的内存不宜过大,内存太大会导致 rdb 文件过大,进一步导致主从同步时全量同步时间过长,在实例重启恢 ...

  7. 关于javascript闭包的最通俗易懂的理解

    这两天在研究闭包,网上一通找,有牛人写的帖子,有普通人写的帖子,但是大多没戳中本小白所纠结的点,而且大多插入了立即执行函数,其实根本不需要的,反而让人产生了误解.这里我用我的方式讲解一下闭包. 1.目 ...

  8. linux小白的入门和目标。

    大家好! 我是一名Linux小白,有幸来到马哥教育这个大家庭与各位同学在未来的五个月里一起学习Linux技术!尽管Linux对于刚接触到的新手会很难,但是我知道痛苦只是暂时的,满路荆棘的后面必是明亮宽 ...

  9. HyperLPR车牌识别

    简介 本文基于HyperLPR进行修改,完整代码参考https://github.com/Liuyubao/PlateRecognition. HyperLPR是一个使用深度学习针对对中文车牌识别的实 ...

  10. 【XSY2484】mex

    Description 给你一个无限长的数组,初始的时候都为0,有3种操作: 操作1是把给定区间[l,r] 设为1, 操作2是把给定区间[l,r] 设为0, 操作3把给定区间[l,r] 0,1反转. ...