python中面向对象的注意点概述总结
作者:€€-飞翔?-~£ 发布时间:2023-10-08 09:35:11
一、继承
与java的继承不同python支持多继承,如Person类同时继承Animal类和Species类可以这样写:
class Animal(object):
def __init__(self):
pass
class Species:
def __init__(self):
pass
class Person(Animal, Species):
country = "CN"
def __init__(self, name, age, sex):
self.name = name
self.age = age
self.sex = sex
def printString(self):
print("name:" + self.name + "\n" + "age:" + str(self.age) + "\n" + "sex:" + self.sex)
person = Person("Jack", 12, "male")
print(person.printString())
括号里的即为父类,多类继承支持优先级如下:
二、是否继承object类的区别
继承了object以后类会增加一些属性,不影响基本使用。
三、封装
与java不同python没有private关键字,使用方法是在方法或变量前加“__”
如:
class Person(Animal, Species):
__country = "CN"
def __init__(self, name, age, sex):
self.name = name
self.age = age
self.__sex = sex
def __breath(self):
print(self.name+"在呼吸.......")
def printString(self):
self.__breath()
print("name:" + self.name + "\n" + "age:" + str(self.age) + "\n" + "sex:" + self.__sex)
person = Person("Jack", 12, "male")
print(person.printString())
print(person._Person__sex)
print(person._Person__country)
person._Person__breath()
设置了“__”后就表示为私密变量或方法。
但python里却有破解私密访问的方法:
即:对象._类名__方法名()或变量名
保密性如下:
__foo__: 定义的是特殊方法,一般是系统定义名字 ,类似 __init__() 之类的。
_foo: 以单下划线开头的表示的是 protected 类型的变量,即保护类型只能允许其本身与子类进行访问,不能用于 from module import *
__foo: 双下划线的表示的是私有类型(private)的变量, 只能是允许这个类本身进行访问了。
foo:就是public方法
四、类方法、静态方法与属性方法
类方法,不能调用实例变量或方法,只能调用类方法或变量,使用时需要在方法上添加“@classmethod”,如下:
class Person(object):
_number = 0
def __init__(self, name, age, sex):
self.name = name
self.age = age
self._number = 2 # 这里操作的是实例对象的变量
Person._number += 1 # 这里对类的静态变量进行操作
self.__sex = sex
def __breath(self):
print(self.name + "在呼吸.......")
@classmethod
def lucky(cls): # cls代表class类本身与self或this不同,self和this代表实例对象
person2 = Person("Alex", 13, 'male')
person2.printString()
print(cls._number) # 输出类变量
def printString(self):
self.__breath()
print("name:" + self.name + "\n" + "age:" + str(self.age) + "\n" + "sex:" + self.__sex)
person = Person("Jack", 12, "male")
person.printString() # 调用时用实例对象
Person.lucky() # 调用时用类
也可以使用静态方法的注解“@staticmethod”类
静态方法,不能调用类或实例的任何变量
属性方法使用注解“@property”,特点是调用时和调用属性变量类似。
class Person(object):
def __init__(self, name, age, sex):
self.name = name
self.age = age
self.__sex = sex
@property
def lucky(self): # cls代表class类本身与self或this不同,self和this代表实例对象
print("233")
@lucky.setter
def lucky(self, num): # cls代表class类本身与self或this不同,self和this代表实例对象
print("233")
self.num = num
person = Person("Jack", 12, "male")
person.lucky # 调用时像调用属性变量一样调用
person.lucky = 1 # 传参和变量传参类似
print(person.num)
属性方法可以调用类和属性变量,传参和变量传参类似。
五、多态
class Animal(object): #相对于抽象类
def show(self):
print("abstract class must be rewrite!")
raise Exception
class Person(Animal):
def __init__(self, name, age, sex):
self.name = name
self.age = age
self.__sex = sex
def show(self):
print("hello")
person = Person("Jack", 12, "male")
print(person.show())
六、python是否存在实质意义上的私有变量?
回答:
不存在的
Python中没有禁止访问类中某一成员的保护机制。Java是一门非常工程化的语言,其哲学就是为工程服务,通过各种限制,尽可能减少程序员编写错误代码的机会。而Python则相反,其哲学为信任编码者,给程序员最少的限制,但程序员必须为自己编写的代码负责。
那是否意味着Python认为面向对象编程不需要封装呢?答案也是否定的。Python通过编码规范而不是语言机制来完成封装,具体而言,Python规定了对变量命名的公约,约定什么样的变量名表示变量是私有的,不应该被访问(而不是不能被访问)。
来源:https://blog.csdn.net/qq_50909707/article/details/122813079
猜你喜欢
- INSERT INTO Table (TestCol) VALUES(‘')其中的TestCol字段,其实在设计的时候,已经被设计为
- 遍历字典: keys() 、values() 、items()1. xxx.keys() : 返回字典的所有的key 返回一个序列,序列中保
- 最近想尝试一下在IBM Bluemix上使用Python语言创建Web应用程序,所以需要在本地搭建Python Web的开发测试环境。关于P
- 本人曾经用过的备份方式有:mysqldump、mysqlhotcopy、BACKUP TABLE 、SELECT INTO OUTFILE,
- 简介模拟登录淘宝已经不是一件新鲜的事情了,过去我曾经使用get/post方式进行爬虫,同时也加入IP代理池进行跳过检验,但随着大型网站的升级
- 写在最前面:我在研究机器学习的过程中,给的数据集是手写数字图片被处理后的由0,1表达的txt文件,今天写一写关于图片转化为二进制txt文件的
- 我以centos 4.4 下面的mysql 5.0.33 手工编译版本为例说明:vi /usr/local/mysql/bin/m
- 1.生成日志并通过http传输出去(通过HTTPHandler方式):#生成并发送日志import loggingfrom logging.
- ASP实现语音分时问候,其实asp实现这个功能很容易,时间判断一下,在某个时间段就调用某个的背景语音。下面是源代码:
- 我一直使用Microsoft的FrontPage 98来开发ASP/ADO之类的Internet数据库应用程序。现在我听说许多人都非常信奉采
- 前言:图像处理是常用的技术,python 拥有丰富的第三方扩展库,Pillow 是 Python3 最常用的图像处理库,目前最高版本5.2.
- 本文实例讲述了python通过加号运算符操作列表的方法。分享给大家供大家参考。具体如下:li = ['a', 'b&
- 酝酿了将近一个春夏秋冬的腾讯网首页终于亮剑!反响热烈!让我们来分享它成功背后的酸甜苦辣吧。腾讯网首页改版终于开花结果。于2008年3月25日
- 本教程配置好后一劳永逸,不用再配置,每次只需要选择 Python 解释器即可打开KBEngine的服务器项目文件夹(资产目录)其主要工程目录
- 大家都知道索引对于数据访问的性能有非常关键的作用,都知道索引可以提高数据访问效率。为什么索引能提高数据访问性能?他会不会有“副作用”?是不是
- js 对url进行编码和解码三种编码和解码函数encodeURI和 decodeURI它着眼于对整个URL进行编码,因此除了常见的符号以外,
- 文章先介绍了关于俄罗斯方块游戏的几个术语。边框——由10*20个空格组成,方块就落在这里面。盒子——组成方块的其中小方块,是组成方块的基本单
- 字符串索引示意图字符串切片也就是截取字符串,取子串Python中字符串切片方法字符串[开始索引:结束索引:步长]切取字符串为开始索引到结束索
- 最近有一个小项目,有如下的需求:将某几个源码文件夹进行打包,文件夹内有py文件、dll文件、exe文件等各种文件类型打包生成的安装包,在进行
- 原文: gradio.app/interface-s…1.全局状态例子来解释import gradio as grsc