python笔记——类与对象的那些事儿
Posted 联邦学习小白
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了python笔记——类与对象的那些事儿相关的知识,希望对你有一定的参考价值。
python一切皆对象
python中除了少数几个语句,其余全都是对象!创建一个类,这个类便称为类对象,也占内存空间,也有它的值。
class Student:
pass
print(id(Student)) #2926222013040
print(type(Student)) #<class 'type'>
print(Student) #<class 'main_.student'>
类的组成
- 类属性:类中方法外定义的变量称为类属性,被该类的所有对象所共享
- 实例属性:初始化实例对象时定义的属性,不同对象之间不共享。
- 实例方法:相当于函数,只不过称呼变了。在类之外定义的称为函数,在类内定义的称为方法。
- 静态方法:使用@staticmethod修饰的方法,使用类名直接访问的方法
- 类方法:使用@classmethod修饰的方法,使用类名直接访问的方法
class Student:
'''像C++等语言是在类名student后面加个括号,里面定义实例化需要的参数,
python只是把他搬到__init__这个构造方法里面来并进行赋值。'''
def __init__(self,name,age):
#实例属性
self.name = name #self.name和self.age称为实例属性,将局部变量name的值赋给实体属性。
self.age = age
native_place = '吉林' #直接写在类里的变量,称为类属性
#实例方法(在类之外定义的称为函数,在类内定义的称为方法)
def info(self): #self写于不写都存在
print('学生信息')
@staticmethod
#静态方法
def method(): #不能写self
print('静态方法')
@classmethod
#类方法
def cm(cls): #cls代表class
print('类方法')
注意到类中不同方法的括号中有的不用参数,有的要self或cls,这是啥意思?
- self:python的类中定义实例方法时的self关键字跟实例方法的意义有关,实例方法由类的实例化对象调用,需要把调用它的实例化对象传入实例方法中,self即是表示实例化对象的形参。说白了就是,因为一个类可以创建多个实例对象,那么就得分清楚哪个对象在调用实例方法,不然要输出张三的信息可能就跑到李四去了。
- cls:跟self关键字的理解类似,实例方法是要区分哪个实例对象调用这个方法,类方法则是哪个类调用这个方法。当两个类有相同名称的类方法时才能分得清。
类的实例化和使用
对类进行实例化,获得类对象的实例对象(说类对象其实是为了强调python中类也是对象)。有了实例,就可以调用类中的内容
1、类的实例化和方法、属性的使用:
实例方法的调用有两种方法:
- 对象名.方法名
- 类名.方法名(对象名)
# __init__初始化中有两个参数,所以实例化对象时也要传入两个参数
stu1 = Student('Jack',20)
#用 "对象名.方法名" 调用属性和方法
stu1.info() #学生信息
print(stu1.name) #20
#也可以用 "类名.方法名(对象名)" 来调用方法——>实际上就是方法定义处的self
Student.info(stu1) #学生信息,作用与stu1.info()相同
2、类属性、类方法、静态方法的使用
- 类属性可由类对象或实例对象调用,但只能由类对象进行修改。
实际上,当实例对象调用类属性时,实例对象会将该类属性复制过来成为自己的实例属性,因此若尝试在实例对象中修改这一属性,其实只是修改了该对象的一个实例属性,并不会影响类属性。
stu1 = Student('张三',20)
stu2 = Student('李四',22)
print(stu1.native_place) #吉林
print(stu2.native_place) #吉林
#修改实例对象的这一属性并不影响类属性
stu1.native_place = '天津'
print(stu1.native_place) #天津
print(Student.native_place) #吉林
#修改类对象的这一属性才叫修改类属性
Student.native_place = '广东'
print(stu1.native_place) #广东
- 类方法可以通过类或实例对象去调用。
类方法用在模拟java定义多个构造函数的情况。 由于Python类中只能有一个初始化方法,不能按照不同的情况初始化类。
#括号内不用传入参数,这样写就代表了是Student类的类方法cm
Student.cm() #类方法
class Book(object):
def __init__(self, title):
self.title = title
@classmethod
def create(cls, title):
book = cls(title=title)
return book
book1 = Book("python")
book2 = Book.create("python and django")
print(book1.title) #python
print(book2.title) #python and django
- 静态方法可以通过类或实例对象去调用。
当一个方法不需要访问任何实例方法和属性(因为静态方法不能访问这些),只通过传入参数并返回数据时,那么它就适合用静态方法来定义。
它唯一的作用不过是不用self参数而已。python里并没有真正意义上的静态方法,因为类本身便是一个实例(继承自object的为type实例,裸的为classobj实例),因此一个“静态方法”其实只不过是类定义对象的成员罢了。
c++的static方法则是正儿八经的静态方法,因为类定义本身不是个实例。
Student.method() #静态方法
动态绑定属性和方法
python是动态语言,在创建对象之后,可以动态地绑定属性和方法。也就是可以为实例对象绑定该对象所属的类并不具有的属性或方法。
class Student:
def __init__(self,name,age):
self.name = name
self.age = age
#在类外定义一个函数
def show():
print('这是一个类外的方法')
#初始化两个实例对象
stu1 = Student('张三',20)
stu2 = Student('李四',22)
'''类Student中并没有gender这一属性,但可以通过动态绑定为stu2对象量身定做一个,
既然是量身定做的,那其他没有进行绑定的对象肯定就没有这一属性'''
stu2.gender = '男'
print(stu2.name,stu2.age,stu2.gender) #李四 22 男
print(stu1.name,stu1.age,stu1.gender) #报错,因为stu1没有绑定gender这一属性
stu1.show = show()
stu1.show() #这是一个类外的方法
stu2.show() #报错,因为stu2没有绑定gender这一属性
以上是关于python笔记——类与对象的那些事儿的主要内容,如果未能解决你的问题,请参考以下文章
《从零开始学Swift》学习笔记(Day 11)——数据类型那些事儿?