Python 面向对象编程详解
作者:Hovey 发布时间:2023-06-25 05:24:23
Python 面向对象
方法没有重载#
在其他语言中,可以定义多个重名的方法,只要保证方法签名唯一即可。方法签名包含3个部分:方法名、参数数量、参数类型。
Python 中,方法的的参数没有声明类型(调用时确定参数的类型),参数的数量也可以由
可变参数控制。因此,Python 中是没有方法的重载的。定义一个方法即可有多种调用方式,相当于实现了其他语言中的方法的重载。
如果我们在类体中定义了多个重名的方法,只有最后一个方法有效。
建议:不要使用重名的方法!Python 中方法没有重载。
#Python 中没有方法的重载。定义多个同名方法,只有最后一个有效
class Person:
def say_hi(self):
print("hello")
def say_hi(self,name):
print("{0},hello".format(name))
p1 = Person()
#p1.say_hi() #不带参,报错:TypeError: say_hi() missing 1 required positional argument: 'name'
p1.say_hi("陈浩")
方法的动态性#
Python 是动态语言,我们可以动态的为类添加新的方法,或者动态的修改类的已有的方法。
#测试方法的动态性
class Person:
def work(self):
print("努力上班!")
def play_game(self):
print("玩游戏")
def work2(self):
print("好好工作,努力上班!")
Person.play = play_game
Person.work = work2
p = Person()
p.play() # 玩游戏
p.work() # 好好工作,努力上班!
我们可以看到,Person 动态的新增了 play_game 方法,以及用 work2 替换了 work 方法。
私有属性和私有方法(实现封装)#
Python 对于类的成员没有严格的访问控制限制,这与其他面向对象语言有区别。关于私有属性和私有方法,有如下要点:
通常我们约定,两个下划线("__")开头的属性是私有的(private)。其他为公共的(public)。
类内部可以访问私有属性(方法)
类外部不能直接访问私有属性(方法)
类外部可以通过“_类名__私有属性(方法)名”访问私有属性(方法)
【注】方法本质上也是属性!只不过是可以通过()执行而已。所以,此处讲的私有属性和公有属性,也同时讲解了私有方法和公有方法的用法。如下测试中,同时也包含了私有方法和公有方法的例子。
【测试】私有属性和公有属性使用测试
#测试私有属性、私有方法
class Employee:
__company = "Danone" #私有类属性. 通过 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)
def __work(self): #私有实例方法 通过 dir 可以查到_Employee__work
return "工作!好好工作,好好赚钱,娶个媳妇!"
p1 = Employee("陈浩",18)
print(p1.name)
# 陈浩
print(dir(p1))
# ['_Employee__age', '_Employee__company', '_Employee__work', '__class__', '__delattr__', '__dict__', '__dir__', '__doc__', '__eq__', '__format__', '__ge__', '__getattribute__', '__getstate__', '__gt__', '__hash__', '__init__', '__init_subclass__', '__le__', '__lt__', '__module__', '__ne__', '__new__', '__reduce__', '__reduce_ex__', '__repr__', '__setattr__', '__sizeof__', '__str__', '__subclasshook__', '__weakref__', 'name', 'say_company']
p1.say_company()
# 我的公司是: Danone
# 陈浩 的年龄是: 18
print(p1._Employee__age) #通过这种方式可以直接访问到私有属性 。通过 dir 可以查到属性:_Employee__age
# 18
print(p1._Employee__work())
# 工作!好好工作,好好赚钱,娶个媳妇!
#print(p1.__age) #直接访问私有属性,报错
#print(p1.__work()) #直接访问私有方法,报错
@property 装饰器
@property 可以将一个方法的调用方式变成“属性调用”
class Employee:
def __init__(self, name, salary):
self.name = name
self.__salary = salary
@property #getter方法
def salary(self):
return self.__salary
@salary.setter #setter方法
def salary(self, salary):
self.__salary = salary
@salary.deleter #deleter方法
def salary(self):
self.__salary = 0
emp = Employee("陈浩", 6000)
print("{0}当前的薪资是{1}".format(emp.name,emp.salary))
# 陈浩当前的薪资是6000
print("*"*12, "加薪啦", "*"*12)
emp.salary = 10000
print("{0}当前的薪资是{1}".format(emp.name,emp.salary))
# 陈浩当前的薪资是10000
print("*"*12, "离职了", "*"*12)
del emp.salary
print("{0}当前的薪资是{1}".format(emp.name,emp.salary))
# 陈浩当前的薪资是0
@property 主要用于帮助我们处理属性的读操作、写操作。对于某一个属性,我们可以直接通过类名.方法名 = 值,进行赋值操作。
属性和方法命名总结#
_xxx:保护成员,不能用“from module import * ”导入,只有类对象和子类对象能访问这些成员。
__xxx__:系统定义的特殊成员
__xxx: 类中的私有成员,只有类对象自己能访问,子类对象也不能访问。(但,在类外部可以通过“对象名. _类名__xxx”这种特殊方式访问。Python 不存在严格意义的私有成员)
注:再次强调,方法和属性都遵循上面的规则
来源:https://www.cnblogs.com/thankcat/p/17013616.html
猜你喜欢
- DesktopNexus 是我最喜爱的一个壁纸下载网站,上面有许多高质量的壁纸,几乎每天必上, 每月也必会坚持分享我这个月来收集的壁纸但是
- 本文实例为大家分享了jQuery Ajax File Upload实例源码,供大家参考,具体内容如下项目结构Default.aspxUplo
- 一、 网页设计中的对比原则一件网页设计作品由许多元素构成,它们的重要性各不相同,其中一些元素的重要性要高于其它元素。一些相互关联,而另一些则
- 计时器setTimeout()和setInterval()两个都是js的计时功能的函数两个有些区别。 setTimeout(): 在js手册
- Blender 并不是唯一一款允许你为场景编程和自动化任务的3D软件; 随着每一个新版本的推出,Blender 正逐渐成为一个可靠的 CG
- 前言使用 Pandas 的between 、cut、qcut 和 value_count离散化数值变量。分箱是一种常见的数据预处理技术有时也
- 本文实例为大家分享了python实现滑雪游戏的具体代码,供大家参考,具体内容如下# coding: utf-8# 滑雪小游戏import s
- 如下所示:import pandas as pd#如果需要的话,需将df中的date列转为datetimedf.date = pd.to_d
- 一、批量新建并保存工作簿import xlwings as xw # 导入库# 启动Excel程序,但不新建工作
- 今天在公司实在没有事做,突然就想到写下商城的购物车的前端框架,当然我这里只有购物车的增删改查,也许写的并不是那么完善,但最重要的是一个入门,
- 在C++11和C#中都有匿名函数的存在。下面看看在python中匿名函数的使用。1.lambda只是一个表达式,函数体比def简单很多。2.
- 1. torch.utils.data.Datasetdatasets这是一个pytorch定义的dataset的源码集合。下面是一个自定义
- 本文实例讲述了Python基于回溯法子集树模板实现8皇后问题。分享给大家供大家参考,具体如下:问题8×8格的国际象棋上摆放八个皇后,使其不能
- 引言我们先来简单学习一下用 Go 实现观察者设计模式,给怎么实现事件驱动编程、事件源这些模式做个铺垫。主要也是我也老没看设计模式了,一起再复
- SQL中的单记录函数 1.ASCII 返回与指定的字符对应的十进制数; SQL> select ascii('A')
- 经常看见有人问,MSSQL占用了太多的内存,而且还不断的增长;或者说已经设置了使用内存,可是它没有用到那么多,这是怎么一回事儿呢? 首先,我
- 一. 输出函数print在python中,print()是可以直接使用的输出函数,将数据输出到控制台上。1. print函数的使用1.1 可
- 爬取过程:你好,李焕英 短评的URL:https://movie.douban.com/subject/34841067/comments?
- 1.创建mysql存储过程,这是个复杂查询加上了判断,比较复杂CREATE PROCEDURE searchAllList (IN trad
- 前言本人曾对 Vuex 作过详细介绍,但是今天去回顾的时候发现文章思路有些繁琐,不容易找到重点。于是,在下班前几分钟,我对其重新梳理了一遍。