28.Python面向对象类:创建类&实例对象,私有属性,类里面的方法,类属性CRUD,常用内置类属性
Posted 孤寒者
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了28.Python面向对象类:创建类&实例对象,私有属性,类里面的方法,类属性CRUD,常用内置类属性相关的知识,希望对你有一定的参考价值。
目录:
每篇前言:
🏆🏆作者介绍:【孤寒者】—CSDN全栈领域优质创作者、HDZ核心组成员、华为云享专家Python全栈领域博主、CSDN原力计划作者
- 🔥🔥本文已收录于Python全栈系列专栏:《Python全栈基础教程》
- 🔥🔥热门专栏推荐:《Django框架从入门到实战》、《爬虫从入门到精通系列教程》、《爬虫高级》、《前端系列教程》、《tornado一条龙+一个完整版项目》。
- 📝📝本专栏面向广大程序猿,为的是大家都做到Python从入门到精通,同时穿插有很多很多习题,巩固学习。
- 🎉🎉订阅专栏后可私聊进一千多人Python全栈交流群(手把手教学,问题解答); 进群可领取Python全栈教程视频 + 多得数不过来的计算机书籍:基础、Web、爬虫、数据分析、可视化、机器学习、深度学习、人工智能、算法、面试题等。
- 🚀🚀加入我一起学习进步,一个人可以走的很快,一群人才能走的更远!
Python面向对象(一)
想必很多人都听说过面向过程和面向对象,如果没有听说过的请自行百度拓展一下知识储备,我这里就以一种很形象的说法给大家简单介绍一下它俩,让大家懂得其区别:
下面这些定义化的东西大家先看看,在心里有个印象,后面讲到哪些方面的时候,大家忘记了可以再来翻翻看看,多次记忆,加深印象,因为有些还挺容易弄混的!
我们首先要知道类是一个抽象的概念。它是一个独立存放变量(属性/方法)的空间。(把一些事物的共有特点封装起来);而实例也是一个独立存放变量的空间(每个实例都是一个独立的变量空间,不同实例之间的空间不可见)。
类名要大写,实例名要小写。
实例名.属性名——>调用某一个实例属性。
类名.属性名——>调用封装在类里面的类的属性。
- 类(Class): 用来描述具有相同的属性和方法的对象的集合。它定义了该集合中每个对象所共有的属性和方法。对象是类的实例。
- 方法:类中定义的函数。
- 类变量:类变量在整个实例化的对象中是公用的。类变量定义在类中且在函数体之外。类变量通常不作为实例变量使用。
- 数据成员:类变量或者实例变量用于处理类及其实例对象的相关的数据。
- 方法重写:如果从父类继承的方法不能满足子类的需求,可以对其进行改写,这个过程叫方法的覆盖(override),也称为方法的重写。
- 局部变量:定义在方法中的变量,只作用于当前实例的类。
- 实例变量:在类的声明中,属性是用变量来表示的。这种变量就称为实例变量,是在类声明的内部但是在类的其他成员方法之外声明的。
- 继承:即一个派生类(derived class)继承基类(base class)的字段和方法。继承也允许把一个派生类的对象作为一个基类对象对待。例如,有这样一个设计:一个Dog类型的对象派生自Animal类,这是模拟"是一个(is-a)"关系(例图,Dog是一个Animal)。
- 实例化:创建一个类的实例,类的具体对象。
- 对象:通过类定义的数据结构实例。对象包括两个数据成员(类变量和实例变量)和方法。
和其它编程语言相比,Python 在尽可能不增加新的语法和语义的情况下加入了类机制。
Python中的类提供了面向对象编程的所有基本功能:类的继承机制允许多个基类,派生类可以覆盖基类中的任何方法,方法中可以调用基类中的同名方法。
对象可以包含任意数量和类型的数据。
然后一个比较重要的点是——>类编码风格:
类名应采用驼峰命名法,即将类名中的每个单词的首字母都大写,而不使用下划线。实例名
和模块名都采用小写格式,并在单词之间加上下划线。
对于每个类,都应紧跟在类定义后面包含一个文档字符串。这种文档字符串简要地描述类的
功能,并遵循编写函数的文档字符串时采用的格式约定。每个模块也都应包含一个文档字符串,
对其中的类可用于做什么进行描述。
可使用空行来组织代码,但不要滥用。在类中,可使用一个空行来分隔方法;而在模块中,
可使用两个空行来分隔类。
需要同时导入标准库中的模块和你编写的模块时,先编写导入标准库模块的 import 语句,再
添加一个空行,然后编写导入你自己编写的模块的 import 语句。在包含多条 import 语句的程序中,
这种做法让人更容易明白程序使用的各个模块都来自何方。
1.1 面向对象基础
- 定义:
class 类名:
pass
- 例如:
# -*- coding: utf-8 -*-
"""
__author__ = 孤寒者
"""
class Person: #定义类名要首字母大写。
a = '两只手,两条腿' #封装在类里面类中的属性 类,是一个独立存放变量(属性/方法)的空间。
wumou = Person() #实例名 = 类名() 实例
zhangmou = Person()
wumou.name = "吴某" #实例的特征 实例属性 (一个实例的特征,就是属性)
wumou.age = 18
zhangmou.age = 20
print(Person.a) #调用类的属性
print(wumou.age) #调用实例属性
- 类与实例之间的关系:::
(1)类:
是一类事物的抽象,不是真实存在的,描绘了该类事物的共性。
例如:“人”,“动物”
(2)实例:
某类事物的具体个体,是该类事物的具体表现,它是真实存在的。
例如:“吴某”是具体的某个人,
“张某”也是具体的某个人。
1.1.1 创建类
实例,类的帮助信息可以通过ClassName.__doc__
查看:
# -*- coding: utf-8 -*-
"""
__author__ = 小小明-代码实体
"""
class MyClass:
"""一个简单的类实例"""
i = 12345
def f(self):
return 'hello world'
# 实例化类
x = MyClass()
# 访问类的属性和方法
print("MyClass 类的属性 i 为:", x.i)
print("MyClass 类的方法 f 输出为:", x.f())
print(MyClass.__doc__)
- 代码实战:
# -*- coding: utf-8 -*-
"""
__author__ = 小小明-代码实体
"""
class Employee:
'所有员工的基类'
empCount = 0
def __init__(self, name, salary):
self.name = name
self.salary = salary
Employee.empCount += 1
def displayCount(self):
print("Total Employee %d" % Employee.empCount)
def displayEmployee(self):
print("Name : ", self.name, ", Salary: ", self.salary)
-
empCount 变量是一个类变量,它的值将在这个类的所有实例之间共享。你可以在内部类或外部类使用 Employee.empCount 访问。
-
第一个方法__init__()方法是一种特殊的方法,被称为类的构造函数或初始化方法,当创建了这个类的实例时就会调用该方法
-
类内部的方法必须有一个额外的第一个参数名称, 按照惯例它的名称是self。self代表类的实例,而不是类。self 不是 python 关键字,把它换成其他的变量名也是可以正常执行的。
-
代码实战:
# -*- coding: utf-8 -*-
"""
__author__ = 小小明-代码实体
"""
class Demo:
def prt(self):
print(self)
print(self.__class__)
t = Demo()
t.prt()
从运行结果可以看出:self 代表的是类的实例,代表当前对象的地址,而 self.__class__
则指向类。
1.1.2 创建实例对象
- 实例化类其他编程语言中一般用关键字 new,但是在 Python 中并没有这个关键字,类的实例化类似函数调用方式。
- 以下使用类的名称 Employee 来实例化,并通过
__init__
方法接受参数。
"创建 Employee 类的第一个对象"
emp1 = Employee("Zara", 2000)
"创建 Employee 类的第二个对象"
emp2 = Employee("Manni", 5000)
1.1.3 私有属性
- 在python中有两个私有属性,分别是在属性前加一个下划线(
_
)和两个下划线(__
)
一个下划线外部可以直接访问,两个下划线外部不能直接访问。
一个下划线只是做简单的标记。
两个是私有属性,不能够直接使用。
python当中的私有属性没有绝对的私有。
# -*- coding: utf-8 -*-
"""
__author__ = 孤寒者
"""
class Person:
_sex = "男"
__age = 18
wumou = Person() #实例
print(Person._sex) #调用类属性
print(Person.__age) #双下划线会报错,不可以直接访问双下划线变量名
print(Person._Person__age) #这样就可以访问双下划线的属性
- 在python中,
_
和__
的使用更多的是一种规范/约定,没有真正限制的目的。 - 定义类中的私有属性也可以被子类继承。
小知识点:
dir() 可以查看方法,里面可以放类名。
1.1.4 类里面的方法
方法就是封装在类里面的一种特殊函数。
例:
# -*- coding: utf-8 -*-
"""
__author__ = 孤寒者
"""
class Person:
def sing(self): #方法,在类里面写函数叫做在类里面定义方法。
print("我最帅!") #里面有一个默认值none。 print("我最帅!",none)
wumou = Person() #定义实例,写类必备。
wumou.sing() #调用类里面的方法。 格式:实例化对象.方法()
Person.sing(self = '要传入的东西')
实例方法 的调用过程和 self:
- self:通常,将默认会传入的那个参数命名为self,用来表示调用这个方法的实例对象本身。
- 实例方法:方法总是定义在类中,但是却叫“实例方法”,因为它表示该类所有实例所共有的行为。
小知识点:self指的是实例,谁去使用它,那么它就是谁。
例:
# -*- coding: utf-8 -*-
"""
__author__ = 孤寒者
"""
class Person:
def sing(self):
print("孤寒者在唱歌%s" % self.geci)
print(id(self)) # 会发现此处的self的id和下面的guhanzhe的id是一样的
guhanzhe = Person() # 在这个实例中,guhanzhe使用了self,所以self就是guhanzhe
print(id(guhanzhe))
# 和函数的传参一样,只是会先传一个自身的实例self
guhanzhe.geci = "温暖了寂寞"
guhanzhe.sing()
1.1.5 访问对象的属性
代码实战:
# -*- coding: utf-8 -*-
"""
__author__ = 小小明-代码实体
"""
class Employee:
'所有员工的基类'
empCount = 0
def __init__(self, name, salary):
self.name = name
self.salary = salary
Employee.empCount += 1
def displayCount(self):
print("Total Employee %d" % Employee.empCount)
def displayEmployee(self):
print("Name : ", self.name, ", Salary: ", self.salary)
# "创建 Employee 类的第一个对象"
emp1 = Employee("Zara", 2000)
# "创建 Employee 类的第二个对象"
emp2 = Employee("Manni", 5000)
emp1.displayEmployee()
emp2.displayEmployee()
print(emp1.name, emp1.salary)
print(emp2.name, emp2.salary)
print("Total Employee %d" % Employee.empCount)
- 就是对类里的属性进行增删改查的操作:
emp1.age = 7 # 添加一个 'age' 属性
emp1.age = 8 # 修改 'age' 属性
emp1.name="Jack" # 修改 'name' 属性
del emp1.name # 删除 'name' 属性
del emp1.age # 删除 'age' 属性
也可以使用以下函数的方式来定制属性访问:
(1)增——如果属性不存在,会创建一个新属性。
setattr(实例名,“属性名”,值) 或者 实例名.属性 = 值
(2)删
delattr(实例名,“属性名”) # 只能删除自己家的属性
(3)改
setattr(实例名,“属性名”,“新属性”) # 有这个属性才可以修改
(4)查
hasattr(实例名,“属性名”) #返回布尔值,有就True,没有就False
或者
getattr(实例名,“属性名”) # 存在就能取到这个值,不存在就报错
实战讲解:
# -*- coding: utf-8 -*-
"""
__author__ = 孤寒者
"""
class Rectangle:
#__init__不能使用return
def __init__(self,length,width):
self.length = length
self.width = width
def area(self):
#使用self 那个实例去使用它,它就是谁
return(self.length*self.width)
a = Rectangle(4,5)
################查
#判断实例有没有这个属性
print(hasattr(a,'length')) #输出True
#实例的这个属性值是什么 获取值,没有就报错
print(getattr(a,'length')) #输出4
################改
setattr(a,'width',50) #本来应该是5,现在改成了50
#还可以写成: a.__setattr__('width', 50)
print(getattr(a,'width')) #输出就是50
################增
#第一种:
#setattr 有则改,无则增
print(hasattr(a,'name')) #在这里实例a里面没有属性name。输出False
setattr(a,'name','hansha') #没有就增加属性name
#还可以写成:a.__setattr__('name', 'hansha')
print(hasattr(a,'name')) #上一句增加了name属性。输出True
#第二种:
a.age = 18
################删
print(getattr(a,'age')) #因为上面增加了属性age。输出为True
delattr(a,'age') #删除属性age
#还可以写成:a.__delattr__('age')
print(getattr(a,'age')) #上面删除了属性age。输出为False
1.1.6 python内置类属性
__dict__
: 类的属性(包含一个字典,由类的数据属性组成)__doc__
:类的文档字符串__name__
: 类名__module__
: 类定义所在的模块(类的全名是’__main__.className
’,如果类位于一个导入模块mymod中,那么className.__module__
等于 mymod)__bases__
: 类的所有父类构成元素(包含了一个由所有父类组成的元组)
代码实战:
# -*- coding: utf-8 -*-
"""
__author__ = 小小明-代码实体
"""
class Employee:
'所有员工的基类'
empCount = 0
def __init__(self, name, salary):
self.name = name
self.salary = salary
Employee.empCount += 1
def displayCount(self):
print("Total Employee %d" % Employee.empCount)
def displayEmployee(self):
print("Name : ", self.name, ", Salary: ", self.salary)
print("Employee.__doc__:", Employee.__doc__)
print("Employee.__name__:", Employee.__name__)
print("Employee.__module__:", Employee.__module__)
print("Employee.__bases__:", Employee.__bases__)
print("Employee.__dict__:", Employee.__dict__)
以上是关于28.Python面向对象类:创建类&实例对象,私有属性,类里面的方法,类属性CRUD,常用内置类属性的主要内容,如果未能解决你的问题,请参考以下文章
28.Python面向对象类:创建类&实例对象,私有属性,类里面的方法,类属性CRUD,常用内置类属性