python面向对象——类
1、在类中定义静态方法和类方法
静态方法就相当于一个普通函数, 静态方法只能调用类变量,不能调用实例变量和实例方法
class Test:
name = 'leilei'
age = 3
def __init__(self, score=5):
self.score = score
self.name = 'tom'
# print(self.name)
# print(Test.name)
# 在类中定义类方法,类方法和静态方法都不能调用实例变量
@classmethod
def print_file(cls):
print(cls.name)
# 定义静态方法,静态方法都可以用类方法代替
@staticmethod
def add(x, y):
print(x+y)
print(Test.name)
test = Test()
# 类方法
test.print_file() # 实例调用
Test.print_file() # 类调用,一般用类调用更规范一点
# 静态方法
test.add(1, 3)
Test.add(3, 5)
2、一个简单的类:
class Test():
name = 'test'
age = 99
def print_file(self):
print(self.name)
def work(self, )
return self.print_file() # 内部调用函数
test = Test()
test.print_file()
# 这就是一个简单的类,为什么还要在开头使用__init__()方法呢,原因是为了传入参数,通过self为前缀的变量都可供类中的所有方法使用
3、类变量和实例变量
调用类变量和实例变量的正确方式:
class Test:
name = 'leilei'
age = 3
def __init__(self, score=5):
self.score = score
self.name = 'tom'
print(Test.name) # 实例方法中可以调用类变量
print(Test.age)
# 内部也可以这样调用类变量
print(self.__calss__.name)
def print_file(self, )
print(self.name)
print(Test.name) # # 实例方法中可以调用类变量
test = Test()
# 调用类变量的正确方式, 若将self.name = 'tom'注释掉,print(test.name)也是调用的类别量
print(Test.name)
print(Test.age)
# 调用实例变量的方式, 当实例变量不存在时,python会搜索类变量
print(test.score)
print(test.name)
4、成员可见性
如果不想将别人访问类中的变量和方法,可以在变量或者方法名前加上__
, 将其变为私有变量和私有方法:
class Test:
name = 'leilei'
age = 3
def __init__(self, score=5):
self.score = score
self.__name = 'tom'
# print(self.name)
# print(Test.name)
def __do_work(self, data = 30):
if data <10:
return '不可以这样'
self.data = data
return self.data+ 10
test = Test()
test.__do_work() # 报错,不能方法私有方法
print(test.__name)# 报错, 不能访问私有变量
5、继承
编写类时,并非总是要从空白开始。如果你要编写的类是另一个现成类的特殊版本,可使用继承继 。一个类继承继 另一个类时,它将自动获得另一个类的所有属性和方法;原有的 类称为父类 ,而新类称为子类子 。子类继承了其父类的所有属性和方法,同时还可以定义自己的属性和方法。
创建子类的实例时,Python首先需要完成的任务是给父类的所有属性赋值。为此,子类的方法__init
__() 需要父类施以援手。
继承父类,子类可以定义自己的构造函数,也可以不定义
在继承中,子类不定义自己的构造函数, 直接调用父类中的实例方法和实例变量
.当子类定义了自己的init方法时,务必要先显示调用父类的init方法,否则会报错
class Work():
def __init__(self, num):
self.num = num
pass
def do_math_work(self, ):
print('we need do math work')
class Test(Work):
name = 'leilei'
age = 3
# def __init__(self, score=5, num, ): # 注意有等号的参数要写在后面,不然会报错
def __init__(self, num, score=5 ): # 当子类定义了自己的init方法时,务必要先显式调用父类的init方法,否则父类会初始化失败
super(Test, self).__init__(num, ) # 显式调用父类的init方法,确保父类初始化成功
self.score = score
self.__name = 'tom'
# print(self.name)
# print(Test.name)
def do_work(self, data):
print(self.score+ data)
print('num: ', self.num) # self.num 在父类中有定义,所有可以调用;也就是调用父类中的实例变量
super().do_math_work() # 在实例方法中调用用父类中的实例方法
num = 50
score = 20
test = Test(num, score)
test.do_math_work()
print('-----------')
test.do_work(20)
### output
we need do math work
-----------
40
num: 50
we need do math work