一、私有化

1、定义

(1)私有化

如果想让类的内部属性不被外界直接访问,可以在这个属性的前面加两个下划线__ ,在 Python中,如果一个属性的前面出现 __,就表示这个属性只能在当前类的方法中被直接访问,不能通过对象直接访问,这个变量就被称为私有变量。

  • __属性: 就是将属性私有化,访问范围仅仅限于类中

(2)封装

  • 私有化属性
  • 定义公有set和get方法
class Student:# __age = 18  类属性def __init__(self,name,age):self.name = name    # 长度为六位self.__age = ageself.__score = 59# 定义公有set和get方法# set为了赋值def setAge(self,age):if age > 0 and age < 120:self.__age = ageelse:print('年龄不在规定范围')# get为了取值def getAge(self):return self.__age# 修改名字长度必须为6def setName(self,name):if len(name) == 6:self.name = nameelse:print('名字不是六位')def __str__(self):return '姓名:{},年龄:{},考试分数:{}'.format(self.name,self.__age,self.__score)yupeng = Student('yupeng','18')
print(yupeng)
yupeng.setAge(20)
print(yupeng)
# yupeng.name = 'xiaopeng'
yupeng.setName('xiaopeng')
print(yupeng)# 拿到于鹏年龄
print(yupeng.getAge())feifei = Student('feifei','21')
print(feifei)
# yupeng.age = 21
# print(yupeng.__score)
# yupeng.__score = 95
# print(yupeng)

(3)好处

  • 隐藏属性不被外界随意修改
  • 也可以修改:
def setXXX(self,xxx):筛选赋值的内容if xxx是否符合条件赋值else:不赋值
  • 如果想获取具体的某一个属性,使用get函数 :
def getXXX(self):return self.__xxx
class Student:def __init__(self, name, age):self.__name = nameself.__age = agedef setName(self, name):if len(name) == 6:self.__name = nameelse:print('名字必须6位')def getName(self):return self.__namedef __str__(self):return '姓名:{},年龄:{}'.format(self.__name, self.__age)# attribute: setName  getName  __str__  __init__s = Student('yupeng', 18)print(s)print(dir(Student))print(dir(s))
# print(s.__name)  # _Student__name
print(s._Student__age)  # 其实它就是__age ,只不过系统自动改名字了。
print(s.__dir__())
print(__name__)

2、开发中的私有化处理:装饰器

class Student:def __init__(self, name, age):self.name = nameself.__age = age# 先有getxxx,@propertydef age(self):return self.__age# 再有set,因为set依赖get@age.setterdef age(self, age):if age > 0 and age < 100:self.__age = ageelse:print('不在规定的范围内')# def setAge(self, age):#     if age > 0 and age < 100:#         self.__age = age#     else:#         print('不在规定的范围内')## def getAge(self):#     return self.__agedef __str__(self):return '姓名:{},年龄:{}'.format(self.name, self.__age)s = Student('peng', 20)
s.name = 'xiaopeng'
print(s.name)s.age = 130
print(s.age)
print(s.__dir__())# 私有化赋值
# s.setAge(30)
# print(s.getAge())

二、关联关系

1、has a

一个类中使用了另外一种自定义的类型,例如:student使用computer book

2. 类型

系统类型: str int float list dict tuple set

自定义类型: 算是自定义的类,都可以将其当成一种类型,

s = Student()-------s是Student类型的对象

class Computer:def __init__(self, brand, type, color):self.brand = brandself.type = typeself.color = colordef online(self):print('正在使用电脑上网....')def __str__(self):return self.brand + '---' + self.type + "---" + self.colorclass Book:def __init__(self, bname, author, number):self.bname = bnameself.author = authorself.number = numberdef __str__(self):return self.bname + '---' + self.author + '----' + str(self.number)class Student:  # has adef __init__(self, name, computer, book):self.name = nameself.computer = computerself.books = []self.books.append(book)def borrow_book(self, book):for book1 in self.books:if book1.bname == book.bname:print('已经借过此书!')breakelse:# 将参数book添加到列表中self.books.append(book)print('添加成功!')def show_book(self):for book in self.books:  # book就是一个book对象print(book.bname)def __str__(self):return self.name + "---" + str(self.computer) + '--------' + str(self.books)# 创建对象
computer = Computer('mac', 'mac pro 2018', '深灰色')book = Book('盗墓笔记', '南派三叔', 10)stu = Student('songsong', computer, book)
print(stu)# 看借了哪些书
stu.show_book()book1 = Book('鬼吹灯', '天下霸唱', 8)stu.borrow_book(book1)print('---------------------')stu.show_book()list1 = [12, 'abc', [1, 2, 3], book, computer]

三、继承关系

1、介绍

Student,Employee,Doctor ----- 都属于人类      相同代码 ------代码冗余,可读性不高

将相同代码提取-----Person类 Student,Employee,Doctor ---》 继承Person class

格式:Student(Person): pass

class Person:def __init__(self, name):self.name = nameself.age = 18def eat(self):print(self.name + "正在吃饭...")def run(self):print(self.name + '正在跑步...')class Student(Person):def __init__(self, name):print('---------->student的init')# 如何调用父类__init__super().__init__(name)  # super()  父类对象class Employee(Person):passclass Doctor(Person):passs = Student("jack")
s.run()
e = Employee('lily')
e.run()
d = Doctor('tom')
d.run()

2、特点

  • 如果类中不定义__init__,调用父类 super class的__init__
  • 如果类继承父类也需要定义自己的__init__,就需要在当前类的__init__调用一下父类__init__
  • 如何调用父类__init__:      super().__init__(参数)           super(类名,对象).__init__(参数)
  • 如果父类有eat(),子类也定义一个eat方法,默认搜索的原则:先找当前类,再去找父类 s.eat() override: 重写(覆盖),父类提供的方法不能满足子类的需求,就需要在子类中定义一个同名的方法,这种行为:重写
  • 子类的方法中也可以调用父类方法: super().方法名(参数)
class Person:def __init__(self, name, age):self.name = nameself.age = agedef eat(self):print(self.name + "正在吃饭...")def run(self):print(self.name + '正在跑步...')class Student(Person):def __init__(self, name, age, clazz):super().__init__(name, age)self.clazz = clazzdef study(self, course):print('{}正在学习{}课程'.format(self.name, course))def eat(self, food):super().eat()print(self.name + "正在吃饭...,喜欢吃:" + food)class Employee(Person):def __init__(self, name, age, salary, manager):super().__init__(name, age)self.salary = salaryself.manager = managerclass Doctor(Person):def __init__(self, name, age, patients):super(Doctor, self).__init__(name, age)self.patients = patientss = Student('阿文', 18, 'python1905')
s.run()
s.study('python基础')
s.eat('满汉全席')e = Employee('tom', 23, 10000, 'king')
e.run()lists = ['zhangsan', 'lisi', 'wangwu', 'zhaoliu']
d = Doctor('lucy', 30, lists)
d.run()

练习:编写一个简单的工资管理程序,系统可以管理以下四类人:工人(worker)、销售员(salesman)、经理(manager)、销售经理(salemanger)。所有的员工都具有员工号,姓名,工资等属性,有设置姓名,获取姓名,获取员工号,计算工资等方法。
  1)工人:工人具有工作小时数和时薪的属性,工资计算法方法为工作小时数*时薪。
  2)销售员:具有销售额和提成比例的属性,工资计算方法为销售额*提成比例。
  3)经理:具有固定月薪的属性,工资计算方法为固定月薪。
  4)销售经理:工资计算方法为销售额*提成比例+固定月薪。

class Person:def __init__(self, no, name, salary):self.no = noself.name = nameself.salary = salarydef __str__(self):msg = '工号:{},姓名:{},本月工资:{}'.format(self.no, self.name, self.salary)return msgdef getSalary(self):return self.salaryclass Worker(Person):def __init__(self, no, name, salary, hours, per_hour):super().__init__(no, name, salary)self.hours = hoursself.per_hour = per_hourdef getSalary(self):money = self.hours * self.per_hourself.salary += moneyreturn self.salaryclass Salesman(Person):def __init__(self, no, name, salary, salemoney, percent):super().__init__(no, name, salary)self.salemoney = salemoneyself.percent = percentdef getSalary(self):money = self.salemoney * self.percentself.salary += moneyreturn self.salary# 创建子类对象
w = Worker('001', 'king', 2000, 160, 50)
s = w.getSalary()
print('月薪是:', s)
print(w)
print('----------------------------------------')
saler = Salesman('002', 'lucy', 5000, 50000000, 0.003)
s = saler.getSalary()
print('月薪是:', s)
print(saler)

3、多重继承

python允许多继承

(1)格式如下:

def 子类(父类1,父类2,..): pass
class Base:def test(self):print('---------Base-----------')class A(Base):def test(self):print('--->AAAAAAAAAA')class B(Base):def test(self):print('----------->BBBBBBBB')class C(Base):def test(self):print('----------->CCCCCCCCC')class D(A, B, C):passd = D()
d.test()import inspect
print(inspect.getmro(D))
print(D.__mro__)

(2)多继承的搜索顺序:

  • 经典类:从左至右,深度优先
  • 新式类:广度优先
class P1(object):def foo(self):print('p1--->foo')def bar(self):print('p1--->bar')class P2(object):def foo(self):print('p2--->foo')class C1(P1, P2):passclass C2(P1, P2):def bar(self):print('C2---->bar')class D(C1, C2):passd = D()
print(D.__mro__)d.foo()
d.bar()

查看搜索顺序 :

  • D.__mro__
  • import inspect     inspect.getmro(D)

Python基础教程—私有化相关推荐

  1. 编程入门书籍-Python基础教程(第3版)

    Python基础教程(第3版) Magnus Lie Hetland 著,袁国忠 译 ISBN:9787115474889 包装:平装 开本:16开 正文语种:中文 出版社:人民邮电出版社 出版时间: ...

  2. Python基础教程学习笔记:第一章 基础知识

    Python基础教程 第二版 学习笔记 1.python的每一个语句的后面可以添加分号也可以不添加分号:在一行有多条语句的时候,必须使用分号加以区分 2.查看Python版本号,在Dos窗口中输入&q ...

  3. python基础教程博客_python基础教程(一)

    之所以选择py交易有以下几点:1.python是胶水语言(跨平台),2.python无所不能(除了底层),3.python编写方便(notepad++等文本编辑器就能搞事情),4.渗透方面很多脚本都是 ...

  4. python基础教程第二版和第三版哪个好-python基础教程 2版和3版哪个适合新手?!...

    python基础教程 2版和3版哪个适合新手? 现在学是学python3. 两者的差异发者本身影响并不大,个别语法细微的差比如python3的print数方式使用,一些常用模块的名称差异,一些机制的差 ...

  5. python基础教程第二版答案-《Python基础教程》(第2版修订版)中要注意的地方...

    想必现在大家学习Python都会用3.0及以上的版本了,虽然2.X的版本依然很多,但是这两年随着部分开源项目不再支持2.X版本,3.X已经成为趋势. 正是在这样的大背景下,我最近用这本<Pyth ...

  6. python基础教程第三版电子版百度云-《python基础教程第三版》高清版PDF免费下载...

    下载地址1:http://t.cn/EGxO1sW Python基础教程 第3版Python简明教程书籍 Python编程从入门到实践 灵程序设计丛书 <python基础教程第三版>高清版 ...

  7. python基础教程视频(全13集)-Python基础视频教程(600集)【传智播客精品教程】...

    Python基础视频教程 初级共600节课 本套视频是传智播客紧抓未来最大趋势--人工智能,应运而生的一套Python入门视频教程,Python是学习人工智能的首选语言,而该视频是专门针对零基础的学员 ...

  8. python基础教程第三版和第二版选哪个-python基础教程 2版和3版哪个适合新手?!...

    python基础教程 2版和3版哪个适合新手? 现在学是学python3. 两者的差异发者本身影响并不大,个别语法细微的差比如python3的print数方式使用,一些常用模块的名称差异,一些机制的差 ...

  9. python基础教程第二版和第三版有什么区别-《Python基础教程》(第2版修订版)中要注意的地方...

    想必现在大家学习Python都会用3.0及以上的版本了,虽然2.X的版本依然很多,但是这两年随着部分开源项目不再支持2.X版本,3.X已经成为趋势. 正是在这样的大背景下,我最近用这本<Pyth ...

最新文章

  1. linux使用grep获取两个文件相同的行或不同的行
  2. linux文本编辑器vi实验心得,linux中vi编辑器的练习心得
  3. 超图理论的一点理解(一)
  4. 视频数据复用光端机故障排除方法
  5. 【转】D365 FO第三方访问https证书问题
  6. 2019年总结人工智能未来发展趋势
  7. Apple Watch新功能曝光:“一键收取”蚂蚁森林能量
  8. 不会真的有人拿了上万甚至几十万在网络上赌博吧?
  9. Snell Advanced Media选择金雅拓保护其知识产权
  10. python linux系统管理与自动化运维pdf_Python Linux系统管理与自动化运维 完整pdf扫描版[191MB]...
  11. Matlab实现Hermite插值多项式
  12. cmdn发布博客(markdowm)
  13. 如何下载B站(哔哩哔哩)高清视频?
  14. 【Redis踩坑日记】Redis由于目标计算机积极拒绝,无法连接
  15. Java剑开天门(二)
  16. 教你用HTML做一个超链接按钮
  17. 海康威视监控云存储服务器,监控设备,云存储服务器,安防监控—年轻人安防官网...
  18. mysqlclient==1.3.7对应mysql版本_MySQL 5.7.30 的安装/升级(所有可能的坑都在这里)...
  19. 彻底解决Word中子标题变黑块问题
  20. OpensAS2搭建+AS2证书制作+SSL证书导入(EDI)

热门文章

  1. EM算法为什么可视为F函数的极大-极大算法?
  2. Hex Tech,一个带编程协同能力的 BI 平台的“危”与“机”
  3. freeswitch 显示主叫名称和主叫号码
  4. 苹果电脑win10蓝牙音响卡顿_win10蓝牙音响音质不清怎么解决
  5. 为什么选择0.1uF电容而不是0.01uF电容?
  6. 微信小游戏-海盗来了打金初体验
  7. matlab案例分析总结,MATLAB统计分析与应用:40个案例分析
  8. NIRec:An Efficient Neighborhood-based Interaction Model for Recommendation on Heterogeneous Graph
  9. 将Vue项目代码打包成桌面应用
  10. 使用EJS脚本实现花生壳动态域名更新服务(一)