python类与对象_python类和对象的区别
在介绍python类与对象之前,首先需要了解面向过程编程和面向对象编程两种程序设计方法。面向过程编程OPP(Procedure Oriented Programming),是一种以事物为中心的编程思想,强调的是结构化编程,函数是程序设计的核心,函数调用是关键。而面向对象编程OOP(Object Oriented Programming),是一种以对象为基础的编程思想,对象为类的实例,一个对象中包含了数据和操作数据的函数。python语言属于面向对象编程。
image-20210822201107678
1 类
1.1 定义类
在Python中使用class关键字来定义类,后边紧跟类名,并以冒号结尾。类名命名通常采用大驼峰式命名法。类的特性之一是继承,可以继承一个或多个基类,基类都写在类名后边的括号中。python3中,如果定义一个类时,没有特别明确继承哪个基类,都默认继承object类。
小驼峰法
变量一般用小驼峰法标识。驼峰法的意思是:除第一个单词之外,其他单词首字母大写。譬如int myStudentCount;
大驼峰法
相比小驼峰法,大驼峰法把第一个单词的首字母也大写了。常用于类名,函数名,属性,命名空间。譬如class DataBaseUser;
class 类名(基类列表):
pass
class DemoCode(object):
'类的定义'
pass
1.2 类属性
属性可以理解为变量,类属性可以理解为类的变量,类属性又分为私有和公有,私有属性只可在类的内部访问,外部无法访问,这点可以类比函数的全局变量和局部变量。公有类属性可以通过类和对象进行访问。
class DemoCode(object):
name='tim'
__age=18 #私有属性
A=DemoCode() #类的实例化,创建对象。
print(DemoCode.name,A.name)#输出tim tim
print(DemoCode.__age,A.__age)#报错,外部无法访问私有属性
1.3 类方法
方法可以理解为函数,类方法可以理解为类的函数,类方法要用装饰器@classmethod来标识。对于类方法,第一个参数必须是类对象,一般以cls作为第一个参数,能够通过类和对象进行访问。
class DemoCode(object):
name = 'tim'
__age = 18 # 私有属性
@classmethod
def getname(cls):
return cls.name
A = DemoCode() # 类的实例化,创建对象。
print(DemoCode.getname(), A.getname()) # 输出tim tim
2 对象
2.1 创建对象
对象是类的实例,类是对象的模板。创建对象类似函数调用的方式,直接类名后加括号,括号内为对象的属性。
class DemoCode(object):
pass
A = DemoCode() # 类的实例化,创建对象。
2.2 对象的属性
对象的属性就是对象的变量,也叫实例变量。python中一般采用def __ init __(self):的特殊方法来对对象属性进行初始化。对象的属性也有私有和公有之分,公有对象的属性只能通过对象进行访问。
class DemoCode(object):
def __init__(self):
self.name='tim'
self.__age=18 #私有属性
A = DemoCode() # 类的实例化,创建对象。
print(A.name)#输出tim 18
print(A.__age)#报错
print(DemoCode.name)#报错
2.3 对象的方法
对象的方法就是对象的函数,也叫实例方法。其与普通函数的区别就是第一个参数必须是对象本身,一般以self表示。在对象的方法被调用的时候,不需要提供与self参数相对应的参数。对象的方法只能通过对象进行访问。
class DemoCode(object):
def __init__(self):
self.name='tim'
self.__age=18 #私有属性
def getname(self):
return self.name,self.__age
A = DemoCode() # 类的实例化,创建对象。
print(A.getname())#输出tim 18
print(DemoCode.getname())#报错
3 其他
3.1 类的特性
- 封装封装的意思可以理解为隐藏一切可以隐藏的实现细节,只向外界暴露(提供)简单的编程接口。类的定义就是封装,它把属性和方法都封装在内部,外界在访问的时候只需知道属性和方法的名字即可。
class DemoCode(object):
name='tim'
age=18
print(DemoCode.name)#通过类名.属性名的方式访问
print(name)#报错,外部无法直接访问
- 继承继承就是从另一个类继承属性和方法,从而减少重复代码的编写。定义的新类称为子类,被继承的类称为基类、父类或超类。子类除了继承基类提供的属性和方法之外,还可以定义自己特有的属性和方法,所以子类比父类拥有更多的能力。
class DemoCode(object):#object就是所有类的基类
pass
------------------------------
class Person(object):
pass
class Student(Person):#继承person这个基类
pass
- 多态多态就是多种形态,类作为模板只有一个,但是对象可以有多个,每个对象都有一种形态。
class Animal:
def kind(self):
print("i am animal")
class Dog(Animal):
def kind(self):
print("i am a dog")
class Cat(Animal):
def kind(self):
print("i am a cat")
class Pig(Animal):
def kind(self):
print("i am a pig")
----------------------
d = Dog()#类的多态
c = Cat()
p = Pig()
3.2 公有和私有
公有属性和方法能被外界所访问。私有属性和方法只能在内部使用,不能被外界所访问。在私有属性和方法的名字前加上两个下划线__,就可以将属性和方法变成私有成员。
class DemoCode(object):#object就是所有类的基类
name='tim'
__age=19
def __getname(self):
return self.name
3.3 魔法方法
魔法方法是python内部已经定义好的,开头和结尾都有双下划线的方法。这些方法在进行特定的操作时会自动被调用,它们是Python面向对象下智慧的结晶。python的魔法方法有很多,本文主要说一下__ init __ 方法,__ init __方法的作用就是对类的属性进行初始化,方便后续调用。
class DemoCode(object):
def __init__(self,name,age):
self.name=name
self.age=age
def getname(self):
return self.name,self.age
A = DemoCode('tim',18) # 创建对象,自动执行类中的 __init__ 方法
print(A.getname())#输出('tim', 18)
3.4 静态方法
静态方法可以理解为普通的函数,只不过定义在类的内部,由类进行调用。静态方法无默认参数,通过装饰器@staticmethod标识。
class DemoCode:
@staticmethod
def static_method(a,b,c):
return(a+b+c)
#调用方法
DemoCode.static_method(1,2,3)#输出6
3.5 装饰器
- @property@property装饰器的作用就是把类内方法当成属性来使用,也就是说之前是DemoCode.getname()的调用方法变为DemoCode.getname的方式。
class DemoCode:
def __init__(self,name,age):
self.name=name
self.age=age
@property
def getname(self):
return self.name,self.age
#调用方法
A = DemoCode('tim',18)
# 类的实例化,创建对象。
print(A.getname)#输出('tim', 18)
print(A.getname())#报错
- @staticmethod
- @classmethod