原创是:高淇老师讲义

Python 中 一切皆对象

=====================================================================================================================================

class Student:

school = "清华大学" # 类属性

count = 0 # 类属性

def __init__(self, name, score):# 构造方法(语言自带)

self.name = name # 实例属性

self.score = score

Student.count = Student.count+1

def say_score(self): # 实例方法(自定义)

print("学校是:", Student.school)

print(self.name, '的分数是:', self.score)

s1 = Student('张三', 80) # s1 是实例对象,自动调用__init__()方法

s1.say_score() # 实例对象调用实例方法

Student.say_score(s1)

print('一共创建{0}个 Student 对象'.format(Student.count))

=====================================================================================================================================

类-->类对象

类的实例-->实例对象

定义类

1、类名称 首字母大写,包含字母、数字、下划线,多个单词:驼峰命名

2、类成员 属性+方法

2.1、类属性

2.2、类方法

2.3、实例属性

2.4、实例方法

2.6、静态方法

2.7、语法定义的方法

实例对象,自动调用__init__(self[,])方法。

Python 对象包含三个部分:

1、id(identity 识别码)

2、type(对象类型)

3、value(对象的值)

属性(attribute)

方法(method)

=====================================================================================================================================

构造方法:

1、__init__(self[,])

2、构造方法作用:用来初始化实例对象的实例属性

3、构造函数调用 类名(参数)

4、__init__(self[,])方法 自己定义系统就不自动定义了,如果自己不定义,系统将自动定义一个不带参数的。

__new__()方法: 用于创建对象,无需重定义该方法,系统自动完成。

实例属性:实例对象的属性

1、实例属性一般在__init__()方法中

2、本类中访问:self.实例属性名

3、创建实例对象后访问:实例对象.实例属性名

4、实例对象可以自行添加实例属性(事先在类中并未定义改实例属性)

=====================================================================================================================================

实例方法:

1、def 方法名(self [, 形参列表]):

函数体

2、对象.方法名([实参列表])

3、特别需注意:实例方法第一个不管是否有自定义参数,参数列表第一个参数必须是self。实例对象调用实例方法时忽略self。

函数 vs 实例方法

1、特定功能的代码块

2、函数要用直接调用,实例方法则需要通过实例对象才能调用(类外部)

3、self

1、dir(obj)可以获得对象的所有属性、方法

2、obj.__dict__ 对象的属性字典

3、pass 空语句

4、isinstance(对象,类型)判断"对象"是不是"指定类型"

=====================================================================================================================================

类对象、类属性、类方法、静态方法

类属性:

类属性属于类对象,可以被所有实例对象共享。

=====================================================================================================================================

类方法:

类方法"类对象"的方法。

类方法通过装饰器@classmethod 来定义。

@classmethod

def 类方法名(cls[,形参列表]):

函数体

1、@classmethod 必须位于方法上面一行

2、cls

3、类方法调用:类名.类方法名

4、类方法访问实例属性和实例方法会导致错误。(原因:实例属性,实例方法是实例对象调用的,如果在类方法中直接调用,可能根本没实例对象)

5、...

pass 占位符

class Student:

school = "清华大学" # 类属性

@classmethod

def printCompany(cls):

print(cls.school)

Student.printCompany()

=====================================================================================================================================

静态方法:

@staticmethod

def 静态方法名([形参列表]) :

函数体

1、@staticmethod 必须位于方法上面一行

2、调用静态方法格式:"类名.静态方法名(参数列表)"

3、静态方法中访问实例属性和实例方法会导致错误

class Student:

@staticmethod

def add(a, b): # 静态方法

print("{0}+{1}={2}".format(a, b, (a+b)))

return a+b

Student.add(20, 30)

=====================================================================================================================================

__del__方法(析构函数)和垃圾回收机制

对象没有被引用时(引用计数为 0),由垃圾回收器调用__del__()方法。

系统会自动提供__del__方法,一般不需要自定义析构方法。

class Person:

def __del__(self):

print("销毁对象:{0}".format(self))

p1 = Person()

p2 = Person()

del p2

print("程序结束")

=====================================================================================================================================

__call__方法和可调用对象

class SalaryAccount:

def __call__(self, salary):

yearSalary = salary*12

return dict(yearSalary=yearSalary)

s = SalaryAccount()

print(s(150000))

=====================================================================================================================================

Python 中方法没有重载

方法签名包含 3个部分:

1、方法名

2、参数数量

3、参数类型

定义多个同名方法,只有最后一个有效。(最后一个覆盖了前面的)

=====================================================================================================================================

方法的动态性

class Person:

def work(self):

print("努力上班!")

def play_game(self):

print("{0}玩游戏".format(self))

def work2(s):

print("好好工作,努力上班!")

Person.play = play_game

Person.work = work2

p = Person()

p.play()

p.work()

Person.play 这个地方的play 在类中并未定义

Person.work 虽然定义了,还是可以重新赋值

通过右边的内容,确定左边的对象。

=====================================================================================================================================

私有属性和私有方法(实现封装)

1、两个下划线开头的属性是私有的。

2、类内部可以访问私有属性(方法)

3、类外部不能直接访问私有属性(方法)

4、类外部可以通过"_类名__私有属性(方法)"访问

class Employee:

__company = "xxx" # 私有类属性. 通过 dir 可以查到 _Employee__company

def __init__(self, name, age):

self.name = name

self.__age = age # 私有实例属性

def say_company(self):

print("我的公司是:", Employee.__company) # 类内部可以直接访问私有属性

print(self.name, "的年龄是:", self.__age)

self.__work()

def __work(self): # 私有实例方法 通过 dir 可以查到 _Employee__work

print("工作!好好工作,好好赚钱,娶个媳妇!")

p1 = Employee("110", 32)

print(p1.name)

print(dir(p1))

p1.say_company()

print(p1._Employee__age)

# 通过这种方式可以直接访问到私有属性。通过 dir 可以查到属性:_Employee__age

# print(p1.__age) #直接访问私有属性,报错

# p1.__sleep() #直接访问私有方法,报错

有属性"__age"在实际存储时是按照"_Person__age"这个属性来存储的。

=====================================================================================================================================

@property 装饰器

@property 可以将一个方法的调用方式变成"属性调用"

class Employee:

def __init__(self, name, salary):

self.name = name

self.__salary = salary

@property # 相当于 salary 属性的 getter 方法

def salary(self):

print("月薪为{0},年薪为{1}".format(self.__salary, (12*self.__salary)))

return self.__salary

@salary.setter

def salary(self, salary): # 相当于 salary 属性的 setter 方法

if(0 < salary < 1000000):

self.__salary = salary

else:

print("薪水录入错误!只能在 0-1000000 之间")

emp1 = Employee("高淇", 100)

print(emp1.salary)

emp1.salary = -200

=====================================================================================================================================

属性和方法命名总结

1、_xxx:保护成员,不能用“from module import * ”导入,只有类对象和子类对象能访问这些成员。

2、__xxx__:系统定义的特殊成员

3、__xxx: 类中的私有成员,只有类对象自己能访问,子类对象也不能访问。(但,在类外部可以通过“对象名. _类名__xxx”这种特殊方式访问。Python 不存在严格意义的私有成员)

注:再次强调,方法和属性都遵循上面的规则。

高淇python讲义百度文库_python 面向对象01相关推荐

  1. python教程百度文库_python教程

    Python 教程 这是小白的 Python 新手教程. Python 是一种计算机程序设计语言.你可能已经听说过很多种流行的编程语言,比如非常 难学的 C 语言, 非常流行的 Java 语言, 适合 ...

  2. python课件百度文库_python教-教学课件.doc

    python教-教学课件 第五单元 进阶程序设计(总10课时) 选择编程语言(1课时) 一.教学目标 1.了解程序设计语言和两种翻译方式:了解Python背景.功能.安装,熟悉Python编程环境:编 ...

  3. 利用Python进行百度文库内容爬取(二)——自动点击预览全文并爬取

    本文是衔接上一篇:<利用Python进行百度文库内容爬取(一)>. 上回说到我们在对百度文库进行爬虫时,需要模拟手机端来进行登录,这样固然可以对文章进行爬取,但是很多时候并不是非常智能的翻 ...

  4. selenium python文档_selenium+python实现百度文库word文档抓取

    更新这个代码最近又改了一点,另外和其他一些小程序一起放在了一个jupyter notebook里,现在挂在github上面.github现在对jupyter notebook的支持非常的好,甚至可以直 ...

  5. 《脚本》Python在线百度文库爬虫(免下载券)

    百度文库,文字类型的资源(如txt, doc, pdf),是可以在前端源码分析获取到的,如果能按照规则合理的提取这些文字资源,就可以实现免下载券获取资源. 作者完成了百度文库的在线版爬虫,只需提供文库 ...

  6. python下载百度文库,没想到竟如此简单

    源码 二话不说,先上代码 # -*- coding: utf-8 -*- #项目地址:https://github.com/JackKing-defier/Baiduwenku #@author: J ...

  7. python深入与提高_Python深入01 特殊方法与多范式

    Python一切皆对象,但同时,Python还是一个多范式语言(multi-paradigm),你不仅可以使用面向对象的方式来编写程序,还可以用面向过程的方式来编写相同功能的程序(还有函数式.声明式等 ...

  8. python二级编程题百度文库_Python自动化面试常见的编程题及答案

    前言 随着行业的发展,编程能力逐渐成为软件测试从业人员的一项基本能力.因此在笔试和面试中常常会有一定量的编码题,主要考察以下几点. 基本编码能力及思维逻辑 基本数据结构(顺序表.链表.队列.栈.二叉树 ...

  9. python知识点汇总百度文库_PYTHON知识点汇总.doc

    print 句子也能够跟上多个字符串,用逗号 " , " 离隔,就能够连成一串输出: print 'The quick brown fox', 'jumps over', 'the ...

最新文章

  1. 微信小程序客服实现自动回复图文消息链接,点击去关注公众号
  2. WinForm 2.0 textBox作为参数的查询,显示在DataGridView
  3. TMG学习(十一),保护企业内网上网安全
  4. 代码流程图生成器_【进阶Python】第五讲:迭代器与生成器
  5. 用JavaScript语言判断一个三位数是否为水仙花数
  6. 数据库每日一题 2020.05.25
  7. PHP可以读取什么配置文件,使用php读取配置文件
  8. 织梦index.php不更新,亲测dede织梦后台无法更新生成,更新没反应的解决方法
  9. 基于SpringBoot的行影旅行网
  10. Excel 英文切换大小写;Excel 中去除重复项
  11. windows下nginx常见问题记录
  12. 29岁华为员工工资曝光,揭露残酷真相:职场下半场,拼的就是这项能力!
  13. 创建一个移动应用的终极指导
  14. 面向对象进阶 三大特性
  15. 读取XML文档解析信息
  16. 机器学习之监督学习:分类
  17. How to install VMware workstation15pro on Manjaro
  18. [JAVA]用数学解释数组移步问题(新增对链表移步的解释)
  19. java技术栈是什么意思?一次认全9大主流技术栈!
  20. “机器学习就是现代统计学”

热门文章

  1. go 求两个时间相差的天数
  2. C/C++ 时间相关用法
  3. 为什么MySQL索引要使用 B+树,而不是其它树形结构?
  4. 请求编码和响应编码乱码原因及解决方案
  5. 使用eclipse开发javaweb注册功能
  6. C# int.Parse()与int.TryParse():将字符串转化为整数
  7. 快用一用 lambda 表达式吧,让你的代码更简洁、更漂亮!
  8. 【手把手教学】基于Maven构建方式使用Mybatis generator自动生成
  9. 【详细解读】CSS渐变用法——Web前端系列学习笔记
  10. (~解题报告~)L1-020 帅到没朋友 (20分)——25行代码AC