第一节:初识类的定义和调用 c1.py

#类 = 面向对象

#类 最基本作用:封装

#类中不仅可以定义变量 还可以定义函数等等,例:

 class student( ):
name = ' '
age = 0 def print_file():
pass

#类的实例化

s = student()

#调用类方法

s.print_file()

#类中编写的函数与普通编写的函数有区别——self ,例:

class student( ):
name = ' '
age = 0 def print_file(self): #要调用类自身的变量需要加上self
print('name:' + self.name)
print('age:' + str(self.age)) #print_file() 报错 类负责定义封装 不要在类里调用

第二节:函数与方法的区别 c2.py

#如何在另外一个模块使用我们的类

 #c2.py调用c1.py的类
from c1 import student
s = student()
s.print_file()

#方法和函数的区别

多数情况下,c,c++把此概念称为函数;java,c#把此概念称为方法。

方法:设计层面的称谓

函数:程序运行,过程式的称谓

也就是说面向对象更关心代码的设计

#类中的变量

变量:在类中被称为数据成员

体现类的封装性

第三节:类与对象 c3.py

#类和对象到底是什么?它们有什么关系?

类是现实世界或思维世界中实体在计算机中的反映,它将数据以及这些数据上的操作封装在一起

类和对象通过实例化关联在一起

#类的设计在于 行为与特征 的设计

 class student( ):
name = ' '
age = 0
def do_homework(slef):
print('homework') #print_file 打印档案行为属于student主体明显不太适合 ,做作业的方法属于student方法没毛病 class printer():
def print_file(self):
print('name:' + self.name)
print('age:' + str(self.age))

#类像一个印刷机,能够通过模板做出各种各样的对象。

通过student类(像一个模板模板)可以产生学生A,学生B...很多个对象,它们都有的特性是name和age

第四节:构造函数

#实例化

a = student( ) #用student这个模板来创造实例a

#构造函数的介绍:

class student():
def _init_(self): #构造函数
print('student') s1 = student()
s1.__init__()
#输出
student
student
#有两个student 原因是:构造函数是调用时python使其自动进行的 无需再调用一次

#注意:构造函数只能return None 也就是默认不写return

#利用构造函数使对象实例化时多种多样

class student():
name = ' '
age = 0
def __init__(self,name,age):
name = name #这里python自己知道左边是变量 右边是形参 是合法的
age = age s1 = student('大头',18) #实例化的多样性 print(s1.name) #输出空值 是为什么呢?!因为这里打印的是类变量name print(student.name) #同样输出 空值

第四节,类变量和实例变量

#类变量和实例变量

类变量:与类关联的变量

实例变量:和对象关联在一起的

#用self完成实例变量的定义
def __init__(self,name,age):
self.name = name
self.age = age
class student():
name = '你的青' #类变量
age = 19
def __init__(self,name,age):
self.name = name #实例变量
self.age = age #实例变量 s1 = student('大头',19)
print(s1.name)
print(student.name) #输出 大头
你的青

第五节:类与对象的变量查找顺序

class student():
name = '你的青 '
age = 0
def __init__(self,name,age):
name = name
age = age s1 = student('大头',18) print(s1.name)
print(student.name) #输出
你的青
你的青 #因为在外部调用时python首先寻找实例里面查找对应变量,没有找到的话就会去类变量里面寻找。

第六节:self与实例方法

class student():
name = '你的青 ' #类变量
age = 0
def __init__(self,name,age):
name = name
age = age print(age) #访问实例变量 最好是带上self.
print(name) #没加self的读取的只是形参变量. 这里的age和name都是形参接收的值。 s1 = student('大头',18) #输出 18
大头

#实例方法的特点即 方法第一个参数需要传入self

第七节:在实例方法内部 中访问实例变量与类变量

#总结已经学习的内容

#方法来定义我们的行为和特征

class student():
sum1 = 0 def __init__(self,name,age):
self.name = name
self.age = age print(sum1) #输出 'sum1' is not define 报错
 class student():
sum1 = 0 def __init__(self,name,age):
self.name = name
self.age = age print(student.sum1) #在实例方法内访问类变量方法一
print(self.__class__.sum1) #在实例方法内访问类变量方法二 #输出 0
0

第八节:新方法——类方法

#类变量的作用

 #实例方法操作类变量

 class student():
sum1=0 def __init__(self,name,age):
self.name = name
self.age = age
self.__class__.sum1 += 1
print("当前班级学生总数:" + str(self.__class__.sum1)) s1 = student('小帅哥',18)
s2 = student('小仙女',18)
s1 = student('你的青',19) #输出
当前班级学生总数:1
当前班级学生总数:2
当前班级学生总数:3

#如何定义一个类方法

 class student():
sum1 = 0 def __init__(self,name,age):
self.name = name
self.age = age @classmethod # 增加一个装饰器
def plus_sum(cls): # 默认cls 即class简写 也可以用self
cls.sum1 += 1
print("当前班级学生总数:" + str(cls.sum1)) s1 = student('小帅哥', 18)
student.plus_sum()
s2 = student('小仙女', 18)
student.plus_sum()
s1 = student('你的青', 19)
student.plus_sum() #输出
当前班级学生总数:1
当前班级学生总数:2
当前班级学生总数:3

#为什么要这样做?规范!和student实例对象无关的东西,例如班级总人数就可以放在类方法里

第九节:新方法——静态方法

class student():
sum1 = def __init__(self,name,age):
self.name = name
self.age = age @classmethod # 增加一个类装饰器
def plus_sum(cls): # 默认cls 即class简写 也可以用self
cls.sum1 +=
print("当前班级学生总数:" + str(cls.sum1)) @staticmethod # 增加一个静态装饰器
def add(x,y):
print('this is a static method') s1 = student
s1.add(,)
student.add(,) #输出
this is a static method
this is a static method #静态方法不同点 函数定义时参数不需要写self 调用时就要写class名
#尽量少用静态方法 和类关联不大

第十节:成员可见性:公开和私有

#探讨python下面变量,方法的可见性

#类的外部 类的内部

class student():
sum1 = 0 def __init__(self,name,age):
self.name = name
self.age = age
self.score = 0 def marking(self,score): #python提倡所有对于类下面变量的更改通过方法来完成
if score < 0: #(粉色代码)这样规则和机制的灵活性很就高
     return '分数不能为负'
   self.score = score
print(self.name + '同学本次考试分数为:' + str(self.score)) @classmethod # 增加一个类装饰器
def plus_sum(cls): # 默认cls 即class简写 也可以用self
cls.sum1 += 1
print("当前班级学生总数:" + str(cls.sum1)) @staticmethod # 增加一个静态装饰器
def add(x,y):
print('this is a static method') s1 = student('青', 20)
s1.marking(60)
result = s1.marking(-6)
print(result) #输出 青同学本次考试分数为:60
分数不能为负

#如何使类的变量或者方法私有化(即类的外部无法访问调用)

#在其他很多语言中,对类的范围是有明确要求的,private代表私有 public代表公开

#在python中,私有化只需要添加双下划线

class student():

     def __init__(self,name,age):
self.name = name
self.age = age def __marking(self,score): #这里添加了双下划线
if score < 0:
     return '分数不能为负'
   self.score = score
print(self.name + '同学本次考试分数为:' + str(self.score)) s1 = student('青',20)
s1.__marking(59) #输出 报错 此时__marking已经私有化
AttributeError: 'student' object has no attribute '__marking'

#构造函数属于python特有函数,自动执行,并且只能返回None,不过它可以从外部调用;小技巧:函数名的前后都添加双下划线的时候,python不会认为它是private。

第十一节:没有什么是不能访问

class student():
def __init__(self, name, age):
self.name = name
self.age = age
self.__score = 0 # 这里设定了实例的私有变量
def marking(self, score):
if score < 0:
return '分数不能为负'
self.__score = score
print(self.name + '同学本次考试分数为:' + str(self.__score))
s1 = student('青', 20)
s1.__score = 1
print(s1.__score) # 尝试输出私有变量 #输出 1 #因为动态语言强行赋值,此时的__score并不是私有变量student_score,可以通过print(s1.__dict__)验证

 1 class student():
def __init__(self, name, age):
self.name = name
self.age = age
self.__score = 0 # 这里设定了实例的私有变量
def marking(self, score):
if score < 0:
return '分数不能为负'
self.__score = score
print(self.name + '同学本次考试分数为:' + str(self.__score))
s1 = student('青', 20)
s1.__score = 1
print(s1.__score) # 尝试输出 s2 = student('傻',18)
print(s2.__score) # 尝试输出私有变量 #输出 报错 因为这里没有强制赋值 所以是直接想输出私有变量
AttributeError: 'student' object has no attribute 'student__score' #其实python只是把私有变量改了名字而已 __score在里面就被改为_student__socre class student():
def __init__(self, name, age):
self.name = name
self.age = age
self.__score = 0 # 这里设定了实例的私有变量
def marking(self, score):
if score < 0:
return '分数不能为负'
self.__score = score
print(self.name + '同学本次考试分数为:' + str(self.__score))
s1 = student('青', 20)
s1.__score = 1
print(s1.__score) # 尝试输出 s2 = student('傻',18)
print(s2._student__score) # 尝试输出私有变量 #输出正常
1
0

第十二节:面对对象三大 特性之 继承性

#回顾之前所学内容

#类由 类的特征 行为 方法 等等组成 继承性就是为了避免我们重复地写代码

#例如 student类的父类还有human类

 #c5.py
from c6 import Human #标准的继承方法
class student(Human): #标准的继承方法
sum = 0
def __init__(self,name,age):
self.name = name
self.age = age
self.score = 0
self.__class__.sum += 1 def do_homework(self)
print('english homework') #c6.py
class Human():
pass

#深化代码,使其有成为意义的继承

 #c6.py
class Human():
def __init__(self,name,age):
self.name = name
self.age = age def get_name(self):
print(self.name) #c5.py
from c6 import Human #标准的继承方法
class student(Human): #标准的继承方法
def do_homework(self):
print('english homework') s1 = student('你的青',20)
s1.get_name()
print(s1.name)
print(s1.age) #输出
你的青
你的青
20

#大多语言只能单继承,python的多继承功能有很大的利用空间

#c6.py
class Human():
sum = 0
def __init__(self,name,age):
self.name = name
self.age = age def get_name(self):
print(self.name) # c5.py
from c6 import Human # 标准的继承方法
class student(Human): # 标准的继承方法 def __init__(self,school,name,age):
self.school = school
Human.__init__(self,name,age) #调用父类的构造函数 从子类中传入父类 灵活的python通过Human类调用一个实例方法时 需要加self s1 = student('人民路','你的青',20) print(s1.school)
print(s1.name)
print(s1.age) #输出
人民路
你的青
20

#调用父类的构造函数还有第二种常用的方法:

#c6.py
class Human():
sum = 0
def __init__(self,name,age):
self.name = name
self.age = age def get_name(self):
print(self.name) # c5.py
from c6 import Human # 标准的继承方法
class student(Human): # 标准的继承方法 def __init__(self,school,name,age):
self.school = school
super(student,self).__init__(name,age) #调用父类的构造函数 这种方法为常用的方法 如果父类名有改变的话不会影响到此方法 s1 = student('人民路','你的青',20) print(s1.school)
print(s1.name)
print(s1.age) #输出
人民路
你的青
20

#当父类和子类出现同名方法时,python会首先调用子类的方法

#如果想调用父类的方法 同样用到super函数调用父类函数

c6.py
class Human():
sum = 0
def __init__(self,name,age):
self.name = name
self.age = age def do_homework(self):
print('chinese homework') # c5.py
from c6 import Human # 标准的继承方法
class student(Human): # 标准的继承方法 def __init__(self,school,name,age):
self.school = school
super(student,self).__init__(name,age) def do_homework(self):
super(Student,self).do_homework()
print('english homework') #调用父类的构造函数 这种方法为常用的方法 如果父类名有改变的话不会影响到此方法 s1 = student('人民路','你的青',20) s1.do_homework() #输出
chinese homework
english homework

【我要学python】面向对象系统学习的更多相关文章

  1. python面向对象编程学习

    python面向对象编程 基本概念理解 面向对象编程--Object Oriented Programming,简称OOP,是一种程序设计思想.OOP把对象作为程序的基本单元,一个对象包含了数据和操作 ...

  2. python 面向对象编程学习

    1. 问题:将所有代码放入一个py文件:无法维护 方案:如果将代码才分放到多个py文件,好处: 1. 同一个名字的变量互相不影响 2.易于维护 3.引用模块: import module 2.包:解决 ...

  3. Python爬虫系统学习(1)

    Python爬虫系统化学习(1) 前言:爬虫的学习对生活中很多事情都很有帮助,比如买房的时候爬取房价,爬取影评之类的,学习爬虫也是在提升对Python的掌握,所以我准备用2-3周的晚上时间,提升自己对 ...

  4. python 面向对象编程学习总结

    面向对象是个抽象的东西,概念比较多,下面会一一介绍. 一.类和实例 类(Class)和实例(Instance)是面向对象最重要的概念. 类是指抽象出的模板.实例则是根据类创建出来的具体的“对象”,每个 ...

  5. 给想学python但还没有接触过的你,python代码的书写规则,小白入门

    Python 文件结构 变量命名 注释 单行注释 多行注释 缩进 Python 文件结构 #!/usr/bin/env python3 # 指定python解释器 # -*- coding: utf- ...

  6. Python爬虫系统化学习(2)

    Python爬虫系统学习(2) 动态网页爬取 当网页使用Javascript时候,很多内容不会出现在HTML源代码中,所以爬取静态页面的技术可能无法使用.因此我们需要用动态网页抓取的两种技术:通过浏览 ...

  7. [Python学习笔记][第六章Python面向对象程序设计]

    1月29日学习内容 Python面向对象程序设计 类的定义与使用 类定义语法 使用class关键词 class Car: def infor(self): print("This is ca ...

  8. Python 系统学习梳理_【All】

    Python学习 1. Python学习---Python安装与基础1205 2. Python学习---PyCharm的使用学习 3. Python学习---Python数据类型1206 4. Py ...

  9. 学python,怎么能不学习scrapy呢!

    摘要:本文讲述如何编写scrapy爬虫. 本文分享自华为云社区<学python,怎么能不学习scrapy呢,这篇博客带你学会它>,作者: 梦想橡皮擦 . 在正式编写爬虫案例前,先对 scr ...

随机推荐

  1. spring-boot RestTemplate 连接池

    以前我们项目都是基于Apache HttpClient 连接池进行web 接口调用,后来用spring-boot, 发现 RestTemplate 挺好用. 简单介绍下: 什么是RestTemplat ...

  2. for-in 和 for

    本文地址:http://www.cnblogs.com/veinyin/p/8745845.html  1 for for ( var i = 0 ; i < len ; i++ ) for 是 ...

  3. sql 通过分数字段倒排获取名次的方法

    row_number() over(order by sort desc) 应用场景: 比如学员成绩表中有userid,username,sorce登字段,需要取出学员成绩的名次:表中没有名次字段,只 ...

  4. Servlet笔记2--模拟Servlet本质、第一个Servlet程序、将响应结果输出到浏览器中

    以下代码均非IDE开发,所以都不规范,仅供参考 模拟Servlet本质: 模拟Servlet接口: /* SUN公司制定的JavaEE规范:Servlet规范 Servlet接口是Servlet规范中 ...

  5. 使用spring的aop监听所有controller或者action日志

    日志还是使用log4,直接配置好文件输出或者控制台打印! 注解或者cml都行,我这里采用xml方式: spring的配置文件中配置日志类和aop: <!-- 日志监控类 --> <b ...

  6. 【codeforces】【比赛题解】#864 CF Round #436 (Div.2)

    做出了4题,还不错,可惜还是掉rating……能保持在蓝名已经不错了. 题目跳转链接. [A]公平的游戏 题意: Petya和Vasya在玩游戏.他们有n张卡片(n是偶数).每张卡片上有一个整数. 游 ...

  7. git checkout 命令详解【转】

    转自:http://www.cnblogs.com/hutaoer/archive/2013/05/07/git_checkout.html 在日常的git操作中,git checkout——检出,是 ...

  8. linux调试工具glibc的演示分析

    偶然中发现,下面的两端代码表现不一样 void main(){ void* p1 = malloc(32);       free(p1); free(p1); // 这里会报double free ...

  9. 使用netcat的正向 / 反向shell

    reverse shell bind shell reverse shell描述图: 在此示例中,目标使用端口4444反向连接攻击主机.-e选项将Bash shell发回攻击主机.请注意,我们也可以在 ...

  10. u-boot移植随笔(7):u-boot启动流程简图【转】

    转自:http://www.latelee.org/porting-uboot/u-boot-porting-bootstrap.html u-boot移植随笔:u-boot启动流程简图 画上面这张图 ...