面向对象…
0x00 类:封装(数据成员+方法)
0x01 对象:类的实例化
如何定义类:class
关键字
数据成员可以比作类下的全局变量,方法则是类下的函数
类只可以描述代码,而不能执行代码,可以将类写入模块,从模块调用类
- 创建类
class Student:
name='zzy'
age=21
def do_homework(self):
print('homework')
类的方法必须带有self
这个参数,且调用数据成员时需要在前面加上self.
=>类实例对象本身
- 由类实例化对象
student1=Student()
构造函数__init__()
构造函数是一个特殊的方法,主要用于类的初始化,当类被调用时,会自动执行,类的参数就是构造函数的参数,可以通过调用类来访问__init__
()方法
通过构造函数参数可以定义实例变量和更改实例变量的值,从而生成不同的对象
class Student:
name='zzy'
age=21
def __init__(self,name,age):
self.name='hxd' #初始化实例变量
self.age=22
print('student')
def do_homework(self):
print('homework')
student1=Student('hhh',20) #构造函数生成对象并且给实例变量赋值
0x02 类变量与实例变量
数据成员是类变量,是该类下所有实例对象共享的,由类生成的实例对象自己的变量是实例变量。
当一个实例对象要赋值给实例变量时,前面要加上self.
没有实例变量但是有一个重名的类变量,会默认使用这个类变量
class Student:
name='zzy'
age=21
def __init__(self,name,age):
self.name = name
self.age = age
def do_homework(self):
print('homework')
print(Student.name) #操作类变量
student1=Student('hxd')
print(student1.name) #操作实例变量
内部变量__dict__
__dict__
字典变量存储了一个对象下所有变量的信息
student1=Student('zzy',21)
print(student1.__dict__)
0x03 实例方法、类方法、静态方法
- 实例方法:实例方法就是普通的方法,可以通过对象访问,在实例方法中可以直接访问实例变量,最好加上
self.
也可以访问类变量,通过实例化对象可以访问实例方法,实例方法就是对象可以操作的方法
在实例方法中访问类变量(__class__
:查看对象所在的类)
class Student:
name='zzy'
def student(self,name,age):
self.name = name
self.age = age
print(Student.name) | print(self.__class__.name) #在实例方法中访问类变量
student1=Student() #实例化对象
student1.student('hhh',20) #对象访问实例方法
- 类方法:类方法是一种特殊的方法,在使用时需要在前面加上装饰器
@classmethod
声明,类方法可以直接访问类变量 要加上cls.
=>类本身
,通过类可以访问类方法,类方法就是类可以操作的方法,在python里对象也可以访问类方法(不提倡)
class Student:
sum=0
@classmethod
def Sum(cls):
print(cls.sum)
Student.Sum() #访问类方法
- 静态方法:静态方法也是一种特殊的方法,在使用时需要在前面加上装饰器
@staticmethod
声明 静态方法不需要默认参数self
,对象和类都可以调用它
class Student:
@staticmethod
def add(x,y):
print('666')
0x04 内部调用
在一个方法的内部可以调用另一个方法,同样需要self.
class Student:
def look_book(self):
self.do_homework()
def do_homework(self):
print('做好了嘻嘻嘻')
student1=Student()
student1.look_book()
0x0成员可见性:公开和私有
在其他语言中,有public
和private
这俩个关键字来声明数据的可见性,但python没有
python的数据默认为公开,在前面加上__
表示私有
class Student:
__name='qixue'
def __init__(self):
pass
print(Student().__name)
如果将实例变量私有化,变量名字前会加上类名,形成一个新的变量