## 类
  - 具体事物的抽象和总结,是事物的共性,由属性和方法两个部分构成,比如一个Person类,有是身高、体重、肤色等属性,也有吃饭、睡觉、观察、等方法

## 对象
  - 具体的事物,单一、个体、特性,是一个类的具体实现,比如一个Person类的对象,此对象同样拥有身高、体重、肤色等属性,也有吃饭、睡觉、观察、等方法,但各个Person对象身高、体重、肤色的值并不相同,吃的东西,睡的床,看的电影都不一样

## 定义类

 # 定义一个空的Person类
class Person(object):
pass # 类的实例化
someone = Person()

  - 对象初始化方法(构造方法),在实例化后立即调用

 class Person(object):
def __init__(self):
print("初始化。。。") someone = Person() # 输出:初始化。。。

  - 给类添加属性
  - 这里的self指的是对象本身

 class Person(object):
def __init__(self, name, age):
self.name = name
self.age = age someone = Person("Stanley", 22) # 实例化时传入此对象的相关属性
print(someone.name) # 输出:Stanley
print(someone.age) # 输出:22

  - 给类添加方法
    - 在参数位置上的self表示当前对象本身(本质上来说是一个形式参数),如果通过对象调用一个方法,那么该对象会自动传入当前方法的第一个参数中
    - self并不是关键字,只是用于接收对象的普通参数,理论上可以用任何一个普通变量名代替

 class Person(object):
def __init__(self, name, age):
self.name = name
self.age = age def eat(self, food):
print("I'm eating %s." % food) someone = Person("Stanley", 22)
someone.eat("instant noodle") # 输出:I'm eating instant noodle.

## 代码重用与拓展 -- 继承
  - 继承就是从已经有的类中衍生出新的类,并在新的类中添加或修改部分功能
  - 使用继承的新类会自动获得父类中的所有方法

 class Person(object):
def __init__(self, name, age):
self.name = name
self.age = age def eat(self, food):
print("I'm eating %s." % food) class Student(Person):
pass stu = Student("Stanley", 22) # Student类什么都没做,但还是拥有__init__和eat()方法
stu.eat("instant noodle") # 输出:I'm eating instant noodle.

  - 可以使用isinstance()函数判断是否是某类的实例

  - 子类的实例一定是父类的实例,父类的实例只是父类的实例,在这个例子中,一个学生一定是一个人,但不是所有人都是学生

 print(isinstance(stu, Person))  # 输出:True
print(isinstance(stu, Student)) # 输出:True

## 覆盖父类中的方法
  - 在子类中定义和父类中某方法名相同的方法,即可用新方法覆盖父类中的方法,包括__init__方法
  - 方法覆盖后,子类对象无法在调用父类中的该方法,而父类对象并不受影响

 class Person(object):
def __init__(self, name, age):
self.name = name
self.age = age def eat(self, food):
print("I'm eating %s." % food) class Student(Person):
def eat(self, food):
print("I'm a student, I eat %s" % food) per1 = Person("Lily", 22)
stu = Student("Stanley", 22)
per1.eat("instant noodle") # 输出:I'm eating instant noodle.
stu.eat("apple") # 输出:I'm a student, I eat apple.

  - 给子类添加新方法
  - 子类中的新方法父类实例并不能调用

 class Person(object):
def __init__(self, name, age):
self.name = name
self.age = age def eat(self, food):
print("I'm eating %s." % food) class Student(Person):
def eat(self, food):
print("I'm a student, I eat %s." % food) def do_homework(self):
print("I'm a student, I have to do homework.") per1 = Person("Lily", 22)
stu = Student("Stanley", 22)
stu.do_homework() # 输出:I'm a student, I have to do homework.
per1.do_homework() # AttributeError: 'Person' object has no attribute 'do_homework'

  - 在子类中使用父类中的方法 -- super()
  - 若在子类中定义__init__方法,则会覆盖掉父类中的__init__方法,所以需要在子类中__init__方法中明确的先调用父类的__init__方法,并传入需要的初始化参数

 class Person(object):
def __init__(self, name, age):
self.name = name
self.age = age def eat(self, food):
print("I'm eating %s." % food) class Student(Person):
def __init__(self, name, age, grade):
super().__init__(name, age)
self.grade = grade def eat(self, food):
print("I'm a student, I eat %s." % food) def do_homework(self):
print("I'm a student, I have to do homework.") per1 = Person("Lily", 22)
stu = Student("Stanley", 22, "Junior")

## 对类进行访问限制 -- 封装
  - 封装就是对对象成员进行访问限制
    - 私有
      - 私有成员是最高级别的封装,只能在当前类或者对象中使用
      - 在成员前面添加两个下划线即可表示该属性是私有属性
      - Python的私有并不是真的私有,是一种称为mangling的改名策略,可以使用对象._classname_attrbutename访问

 class Student:
__name = "Stanley"
__age = 18 stu = Student()
print(stu.__name)
# 私有属性无法直接访问
# 输出:AttributeError: 'Student' object has no attribute '__name'
print(stu._Student__name)
# 私有属性可以通过特殊方式访问
# 输出:Stanley

本文参考:

  [美]Bill Lubanovic 《Python语言及其应用》

Python类与对象--基础的更多相关文章

  1. python类与对象各个算数运算魔法方法总结

    1.python类与对象各个算术运算魔法方法总结: 2.各个魔法方法应用举例: 3.实例训练: (1)我们都知道在 Python 中,两个字符串相加会自动拼接字符串,但遗憾的是两个字符串相减却抛出异常 ...

  2. python 类和对象的属性

    python类和对象的属性分为类属性和对象属性两大类,类属性属于类,而对象属性属于对象. 1. 父类的对象属性会被子类的对象继承. 2. 父类的类属性会被子类继承,还是作为类属性,如果父类改变了类属性 ...

  3. MOOC C++笔记(二):类和对象基础

    第二周:类和对象基础 面向对象程序设计的四个基本特点 抽象.封装.继承.多态. 面向对象程序设计的过程 1.从客观事物抽象出类 抽象出的事物带有成员函数与成员变量(类似于带函数的结构体) 成员变量和成 ...

  4. 一文讲全了Python 类和对象内容

    摘要:这是一个关于 Python 类和对象的全部内容. 本文分享自华为云社区<从零开始学python | Python 类和对象-面向对象编程>,原文作者:Yuchuan  . Pytho ...

  5. python类、对象

    python类.对象 学习完本篇,你将会深入掌握 什么是类,对象 了解类和对象之间的关系 能独立创建一个People(人类),属性有姓名.性别.年龄.提供一个有参的构造方法,编写一个show方法,输出 ...

  6. python 类和对象

    类和对象 类 1.类的组成    数据和函数,二者是类的属性 2.两个作用: 实例化 属性引用  属性引用:类名.属性(增删改查)   实例化: 类名加括号就是实例化,会自动出发__init__的运行 ...

  7. python 类、对象、方法、属性

    在python中,一个对象的特征也称为属性(attribute).它所具有的行为也称为方法(method) 结论:对象=属性+方法 在python中,把具有相同属性和方法的对象归为一个类(class) ...

  8. python类、对象、方法、属性之类与对象笔记

    python中一切皆为对象,所谓对象:我自己就是一个对象,我玩的电脑就是对象,坐着的椅子就是对象,家里养的小狗也是一个对象...... 我们通过描述属性(特征)和行为来描述一个对象的.比如家里的小狗, ...

  9. python类与对象基本语法

    面向对象编程的2个非常重要的概念:类和对象. 对象是面向对象编程的核心,在使用对象的过程中,为了将具有共同特征和行为的一组对象抽象定义,提出了另外一个新的概念--类. 类就相当于制造飞机时的图纸,用它 ...

随机推荐

  1. ngnix 反向代理

    1       课程目标 掌握nginx+tomcat反向代理的使用方法. 掌握nginx作为负载均衡器的使用方法. 掌握nginx实现web缓存方法. 2       nginx介绍 2.1    ...

  2. Java Knowledge series 1

    Programming language evolves always along with Compiler's evolvement JVM as Additional Indirection I ...

  3. 轻松完成excel读写操作- 基于POI的框架BingExcel的使用(2)

    在进行 类转换时候,系统默认注册了一些转换器,当然你也可以自定局部或者全局的转换器.下面进行具体使用说明  java类说明 对应的java实体类,其属性必须要有__@CellConfig__注解,此注 ...

  4. 最小正子序列(序列之和最小,同时满足和值要最小)(数据结构与算法分析——C语言描述第二章习题2.12第二问)

    #include "stdio.h" #include "stdlib.h" #define random(x) (rand()%x) void creat_a ...

  5. MYSQL:随机抽取一条数据库记录

    今天我们要实现从随机抽取一条数据库记录的功能,并且抽取出来的数据记录不能重复: 1.首先我们看文章表中的数据: 2.实现功能代码如下: 1 /** * 获取随机的N篇文篇 * @param int $ ...

  6. kinectV2平面检测

    最近做一个关于kinect的东西,主要是在RGB图上提取指定的平面.对于kinect也是刚刚接触不是很熟悉,捣鼓了两天做了很粗糙的东西,但是也学到了一些东西,所以记录一下. 思路大概就是: 在RGB中 ...

  7. 如何使用ABAP代码反序列化JSON字符串成ABAP结构

    假设我有这个JSON字符串如下图所示: 我的任务是解析出上图黑色方框里的几个字段,比如ObjectID, ETag, BuyerID, DateTime, ID, Name等等,把它们的值存储到对应A ...

  8. UESTC 757 棋盘

    虽然是水题,但是还是很interesting的.(大概就是我最晚出这个题了... 博弈感觉就是靠yy能力啊.这题是对称性. 最后的必败态是白色格子对称的,一旦对称形成,对手怎么选,跟随就好,对手无法摆 ...

  9. POJ-1469 COURSES---二分图最大匹配--匈牙利算法

    题目链接: https://vjudge.net/problem/POJ-1469 题目大意: 给你p门课程和n个学生,一个学生可以选0门,1门,或者多门课程,现在要求一个由p个学生组成的集合,满足下 ...

  10. Prim算法求权数和,POJ(1258)

    题目链接:http://poj.org/problem?id=1258 解题报告: #include <iostream> #include <stdio.h> #includ ...