0
点赞
收藏
分享

微信扫一扫

28.Python面向对象(一)【类:创建类&实例对象,私有属性,类里面的方法,类属性CRUD,常用内置类属性】


目录:

  • ​​每篇前言:​​
  • ​​Python面向对象(一)​​
  • ​​1.1 面向对象基础​​
  • ​​1.1.1 创建类​​
  • ​​1.1.2 创建实例对象​​
  • ​​1.1.3 私有属性​​
  • ​​1.1.4 类里面的方法​​
  • ​​1.1.5 访问对象的属性​​
  • ​​1.1.6 python内置类属性​​

每篇前言:

🏆🏆作者介绍:【孤寒者】—CSDN全栈领域优质创作者、HDZ核心组成员、华为云享专家Python全栈领域博主、CSDN原力计划作者

  • 🔥🔥本文已收录于Python全栈系列专栏:​​《Python全栈基础教程》​​
  • 🔥🔥热门专栏推荐:​​《Django框架从入门到实战》、​​​​《爬虫从入门到精通系列教程》、​​​​《爬虫高级》、​​​​《前端系列教程》、​​​​《tornado一条龙+一个完整版项目》。​​
  • 📝​📝本专栏面向广大程序猿,为的是大家都做到Python从入门到精通,同时穿插有很多很多习题,巩固学习。
  • 🚀🚀加入我一起学习进步,一个人可以走的很快,一群人才能走的更远!

Python面向对象(一)

想必很多人都听说过面向过程和面向对象,如果没有听说过的请自行百度拓展一下知识储备,我这里就以一种很形象的说法给大家简单介绍一下它俩,让大家懂得其区别:

28.Python面向对象(一)【类:创建类&实例对象,私有属性,类里面的方法,类属性CRUD,常用内置类属性】_面向对象


下面这些定义化的东西大家先看看,在心里有个印象,后面讲到哪些方面的时候,大家忘记了可以再来翻翻看看,多次记忆,加深印象,因为有些还挺容易弄混的!

我们首先要知道类是一个抽象的概念。它是一个独立存放变量(属性/方法)的空间。(把一些事物的共有特点封装起来);而实例也是一个独立存放变量的空间(每个实例都是一个独立的变量空间,不同实例之间的空间不可见)。

类名要大写,实例名要小写。

实例名.属性名——>调用某一个实例属性。
类名.属性名——>调用封装在类里面的类的属性。

  • 类(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__)

28.Python面向对象(一)【类:创建类&实例对象,私有属性,类里面的方法,类属性CRUD,常用内置类属性】_面向对象_02

  • 代码实战:

# -*- 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()

28.Python面向对象(一)【类:创建类&实例对象,私有属性,类里面的方法,类属性CRUD,常用内置类属性】_python_03


从运行结果可以看出: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:

  1. self:通常,将默认会传入的那个参数命名为self,用来表示调用这个方法的实例对象本身。
  2. 实例方法:方法总是定义在类中,但是却叫“实例方法”,因为它表示该类所有实例所共有的行为。

小知识点: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()

28.Python面向对象(一)【类:创建类&实例对象,私有属性,类里面的方法,类属性CRUD,常用内置类属性】_python_04

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)

28.Python面向对象(一)【类:创建类&实例对象,私有属性,类里面的方法,类属性CRUD,常用内置类属性】_私有属性_05

  • 就是对类里的属性进行增删改查的操作:

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(实例名,“属性名”) # 存在就能取到这个值,不存在就报错

28.Python面向对象(一)【类:创建类&实例对象,私有属性,类里面的方法,类属性CRUD,常用内置类属性】_面向对象_06

实战讲解:

# -*- 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,常用内置类属性】_原力计划_07


举报

相关推荐

0 条评论