【 python面向对象——类】

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

猜你喜欢

转载自blog.csdn.net/zhiqingAI/article/details/127210446