## 类
  - 具体事物的抽象和总结,是事物的共性,由属性和方法两个部分构成,比如一个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. 集成Springboot+MyBatis+JPA

    1.前言 Springboot最近可谓是非常的火,本人也在项目中尝到了甜头.之前一直使用Springboot+JPA,用了一段时间发现JPA不是太灵活,也有可能是我不精通JPA,总之为了多学学Spri ...

  2. 【转载】了解CSS/CSS3原生变量var

    文章转载自:鑫空间鑫生活(https://www.zhangxinxu.com/) 原文链接:http://www.zhangxinxu.com/wordpress/?p=5804 内容摘要: 在任何 ...

  3. Spring-cloud之Ribbon负载均衡的使用及负载均衡策略配置(与Eurka配合使用)

    什么是Ribbon,ribbon有什么用,个人先总结一下(不正确请提出讨论):Ribbon是基于客户端的负载均衡器,为我们提供了多样的负载均衡的方案,比如轮询,最小的并发请求的server,随机ser ...

  4. 位运算(1)——Hamming Distance

    https://leetcode.com/problems/hamming-distance/#/description 输入:两个整数x,y,且0 ≤ x, y < 231. 输出:x,y的二 ...

  5. BZOJ1044: [HAOI2008]木棍分割(dp 单调队列)

    题意 题目链接 Sol 比较套路的一个题. 第一问二分答案check一下 第二问设\(f[i][j]\)表示前\(i\)个数,切了\(j\)段的方案数,单调队列优化一下. 转移的时候只需要保证当前段的 ...

  6. IntelliJ、ReSharper 4折 加入慧都“惊喜惠”

    慧都2013岁末回馈惊喜不断!著名的软件开发公司JetBrains旗下所有产品加入"惊喜惠"活动环节, JAVA IDE——IntelliJ IDEA,.NET效率工具集——ReS ...

  7. CSS 属性之中经常出现的百分比(转)

    CSS 的属性值中经常会出现百分比,搞清它们的基数是一件很重要的事情.我特意查看了一下 W3C 的 CSS2.1 标准,在此整理下: 百分比单位 乘以包含块的宽度 margin, padding, l ...

  8. 【Microsoft Azure学习之旅】Azure Java SDK - Service Bus的认证问题

    [2014年12月12日增加备注:12月10日,Microsoft Azure Java SDK team发布了v0.7.0版本,增加对Service Bus SAS的支持,已解决这个问题:-)] 最 ...

  9. Struts2_结果类型_resulttype_1

    看下面的例子: 一般使用4种:dispatcher(容器内跳转到JSP页面).redirect(重定向到jsp页面).chain(容器内跳转到另一个Action).redirectAction(重定向 ...

  10. leetcode: 贪心

    1. jump game Given an array of non-negative integers, you are initially positioned at the first inde ...