面向对象的重要概念就是类(Class)和实例(Instance),必须牢记类是抽象的模板,比如学生类Student,而实例是根据类创建出来的一个个具体的对象,每个对象都拥有相同的方法,单各自的数据可能不同。

  以Student为列,在Python中,定义类是通过class关键字

>>> class Student(object):
... pass

  class关键字后面紧接是类名,即Student,类名通常是大小字母开头,紧接着是(object),表示该类从哪个类继承下来,通常没有合适的继承类,就使用object类,这是使用类最终都会继承的类

  定义好了Student类,就可以根据Student类创建出Student实例,创建实例通过类名+()实现

>>> bart=Student()
>>> bart
# bart指向就是一个Student的实例0x7ffbd69f7a20为实例的内存地址
<__main__.Student object at 0x7ffbd69f7a20>
>>> Student
#表示Student是一个类class
<class '__main__.Student'>

  可以自由地给实例变量绑定属性,比如,给实例bart绑定一个name属性

>>> bart.name='Zhang San'
>>> bart.name
'Zhang San'

  由于类可以起到模板的作用,因此,可以在创建实例的时候,把一些我们认为必须绑定的属性强制填写进去。通过定义一个特殊的__init__方法,在创建实例的时候就把name,score等属性绑上去

class Student(object):
def __init__(self,name,score):
self.name=name
self.score=score

  PS:特殊方法__init__前后分别有两个下划线

  __init__方法是第一个参数永远是self,表示创建实例的本身,因此在__init__方法内部,就可以把各种属性绑定到self,因为self执行创建实例的本身

  有了__init__方法,在创建实例的时候就不能传入空的参数了,必须传入与__init__方法匹配的参数,但self不需要传,Python解释器自己会把实例变量传进去

>>> bart=Student('ZhangSan',59)
>>> bart.name
'ZhangSan'
>>> bart.score
59

  为查看self是否是实例本身在类里面增加一个print打印self然后在外部创建实例的时候打印一下实例本身看内存地址是否相同

class Student(object):
def __init__(self,name,score):
self.name=name
self.score=score
print('类内部打印实例',self)
bart=Student('Zhang San',59)
print('类外部打印实例',bart)

  运行结果,内存地址是相同的

类内部打印实例 <__main__.Student object at 0x7f250da8a630>
类外部打印实例 <__main__.Student object at 0x7f250da8a630>

  和普通函数相比,在类中定义的函数只有一点不同,就是第一个参数永远是实例变量self,并且,调用时不用传递该参数。除此以外,类方法和普通函数没有什么区别,所以,仍然可以使用默认参数,可变参数,关键字参数和命名关键字参数。

  数据封装

  面向对象编程的一个重要特点就是数据封装。在上面的Student类中,每个实例就拥有各自的name和score这些数据。我们可以通过函数来访问这些数据,比如打印一个学生的名字和成绩

>>> def print_score(std):
... print('%s:%s'% (std.name,std.score))
...
>>> print_score(bart)
ZhangSan:59

  但是,既然Student实例本身就拥有这些数据,要访问这些数据,就没有必要从外面的函数去访问,可以直接在Student类的内部定义访问数据的函数,这样就把数据给封装起来了。这些封装数据的函数是和Student类关联起来的,我们称之为类的方法

>>> class Student(object):
... def __init__(self,name,score):
... self.name=name
... self.score=score
... def print_score(self):
... print('%s:%s' %(self.name,self.score))
...
>>> bart=Student('Zhangsan',59)
>>> bart.print_score()
Zhangsan:59

  要定义一个方法,除了第一个参数self外,其他和普通函数一样。要调用一个方法,只需要在实例变量上直接调用,出来self不用传递,其他参数正常传递

  这样一来,我们从外面看Student类,就只需要知道,创建实例需要给出name和score,而如果打印,都是在Student类的内部定义的,这些数据和逻辑被封装起来了,调用很容易,但却不知道内部的实现细节。

  封装的另一个好处是可以给Student内增加新的方法,比如get_grade

class Student(object):
def __init__(self,name,score):
self.name=name
self.score=score
def print_score(self):
print('%s:%s' %(self.name,self.score))
def get_grade(self):
if self.score>=90:
return 'A'
elif self.score>=60:
return 'B'
else:
return 'C'
lisa=Student('Lias',99)
bart=Student('Zhangsan',59)
print(lisa.name,lisa.get_grade())
print(bart.name,bart.get_grade())

  运行结果

Lias A
Zhangsan C

  

  小结:

  类是创建实例的模板,而实例是一个个具体的对象,各个实例拥有的数据都互相独立,互不影响

  方法就是与实例绑定的函数,和普通函数不同,方法可以直接访问实例的数据

  通过实例调用方法,就直接操作了对象内部的数据,但无需知道方法内部的实现细节

  和静态语言不同,Python允许对实例变量绑定任何数据,也就是说,对于两个实例变量,虽然他们是同一个类的不同实例,但拥有的变量名称可能不同

>>> bart=Student('Zhangsan',59)
>>> lisa=Student('lisa',99)
>>> bart.age=18
>>> bart.age
18
>>> lisa.age
Traceback (most recent call last):
File "<stdin>", line 1, in <module>
AttributeError: 'Student' object has no attribute 'age'

  给实例bart绑定了一个age但是lisa没有绑定,所以报错

Python3之类和实例的更多相关文章

  1. Python3 的urllib实例

    在Python3中合并了 urllib 和 urllib2, 统一命名为 urllib 了,我觉得这样更加合理了.让我们可以像读取本地文件一样读取WEB上的数据.封装了一个类,供以后方便使用吧!并附带 ...

  2. 【转】python3 发邮件实例(包括:文本、html、图片、附件、SSL、群邮件)

    特别留意群邮件方式,这是工作中用得多的. 附件,HTML,图片,都需要的. 文件形式的邮件 [python] view plain copy 1.#!/usr/bin/env python3 2.#c ...

  3. python3 之 闭包实例解析

    一.实例1: def make_power(y): def fn(x): return x**y return fn pow3 = make_power(3) pow2 = make_power(2) ...

  4. Python3面向对象编程实例

    /*认真研究完这个实例,理解python面向对象编程的方法*/class Person: """人员信息""" # 姓名(共有属性) nam ...

  5. python3类和实例

    面向对象最重要的概念就是类(Class)和实例(Instance),必须牢记类是抽象的模板,比如Student类,而实例是根据类创建出来的一个个具体的“对象”,每个对象都拥有相同的方法,但各自的数据可 ...

  6. Python3之类和实例继承和多态

    在OPP程序设计中,当我们定义一个class的时候,可以从某个现有的class继承,新的class称为子类(Subclass),而被继承的class称为基类,父类或超类 例如,我们已经编写了一个名为A ...

  7. Python3之类和实例访问限制

    在Class内部,可以有属性和方法,而外部代码可以通过直接调用实例变量的方法来操作数据,这样,就隐藏了内部的复杂逻辑. 但是,从前面的Student类定义来看,外部代码还是可以自由地修改一个实例的na ...

  8. python3:类和实例

    面向对象最重要的概念就是类(Class)和实例(Instance),必须牢记类是抽象的模板,比如Student类,而实例是根据类创建出来的一个个具体的“对象”,每个对象都拥有相同的方法,但各自的数据可 ...

  9. Python3基础 if-else实例 判断输入的数字是否为8

    镇场诗:---大梦谁觉,水月中建博客.百千磨难,才知世事无常.---今持佛语,技术无量愿学.愿尽所学,铸一良心博客.------------------------------------------ ...

随机推荐

  1. BZOJ2956: 模积和——整除分块

    题意 求 $\sum_{i=1}^n \sum_{j=1}^m (n \ mod \ i)*(m \ mod \ j)$($i \neq j$),$n,m \leq 10^9$答案对 $1994041 ...

  2. BZOJ 3601 一个人的数论 (拉格朗日插值+莫比乌斯反演)

    题意 略 题解 orz Freopen的博客 CODE #pragma GCC optimize (3) #include <bits/stdc++.h> using namespace ...

  3. bootstrap之collapse

    <div class="container"> <!--该button可以控制div是否显示 1.首先给button设置data-toggle="col ...

  4. h5css3弹性盒子

    弹性盒子: 老:display:box: 新:display:flex: 方向:flex-direction: 横向正方向 row/横向反方向 row-reverse/纵向正方向 column/纵向反 ...

  5. NuGet本地包自定义路径

    <?xml version="1.0" encoding="utf-8"?> <configuration> <packageSo ...

  6. Codeforces Round #555 (Div. 3) C1,C2【补题】

    D1:思路:L,R指针移动,每次选最小的即可. #include<bits/stdc++.h> using namespace std; #define int long long #de ...

  7. sql server 将某一列的值拼成一个字符串 赋值到一个字段内

    DECLARE @refCodeitems VARCHAR(800),   SELECT @refCodeitems=ISNULL(@refCodeitems,'')+refCodeitem +'/' ...

  8. linux产看磁盘信息命令-lsblk,blkid,dumpe2fs

    一.lsblk命令用于列出所有可用块设备的信息,而且还能显示他们之间的依赖关系,但是它不会列出RAM盘的信息.块设备有硬盘,闪存盘,cd-ROM等等.lsblk命令包含在util-linux-ng包中 ...

  9. Turn Off Windows Firewall Using PowerShell and CMD

    If you want to turn off the Windows Firewall, there are three methods. One is using the GUI which is ...

  10. PowerShell中汉字与ASCII码相互转换

    function asc($param) { $rtn = '' $list = $param -split '' foreach ($char in $list) { if($char -ne '' ...