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

Posted 孤寒者

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了28.Python面向对象类:创建类&实例对象,私有属性,类里面的方法,类属性CRUD,常用内置类属性相关的知识,希望对你有一定的参考价值。

目录:

每篇前言:


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:

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

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,常用内置类属性

创建java类并实例化类对象

Python之路-面向对象&继承和多态&类属性和实例属性&类方法和静态方法

Python面向对象之类属性类方法静态方法

面向对象(初级篇)

C++类和对象(上篇)