python笔记——类与对象的那些事儿

Posted LeoJarvis

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 22)——闭包那些事儿!

Numpy的那些事儿

C++临时对象那些事儿

C++临时对象那些事儿

《从零开始学Swift》学习笔记(Day 11)——数据类型那些事儿?

1.跟老韩学Python之工具那些事儿