Python面向对象(静态方法和类方法)
1.类和对象
面向对象:
一种基于面向过程的新的编程思想,顾名思义该思想是站在对象角度思考问题,我们把多个功能合理放到不同对象里,强调的是具备某些功能的对象。
类:
实际上是对某种类型的对象定义变量和方法的原型。它表示对现实生活中一类具有共同特征的事物的抽象,是面向对象编程的基础。
类是对某个对象的定义。它包含有关对象动作方式的信息,包括它的名称、方法、属性和事件。实际上它本身并不是对象,因为它不存在于内存中。
当引用类的代码运行时,类的一个新的实例,即对象,就在内存中创建了。虽然只有一个类,但能从这个类在内存中创建多个相同类型的对象。
2.类的格式
在程序开发过程中,设计一个类,通常需要满足三个要求:
1.类名:这类事物的名字,满足大驼峰命名法
2.属性:这类事物具有的特征
3.方法:这类事物具有的行为
当一个类定义完成后,要使用这个类来定义对象,语法格式: 对象名 = 类名()
(1)格式
1 class 类名(object):
2 成员(方法)
(2)python中如何通过类创建对象
1 对象名 = 类名()
3.定义一个Phone类
1 class Phone:
2 brand = 'xiaomi'
3 price = 4999
4 type = 'mate 80'
5
6 # Phone类里面的方法:call
7 def call(self):
8 print(self) # 地址:0x000001EFF727FE48
9 print('正在访问通讯录:')
10 print('正在打电话...')
11
12
13 phone1 = Phone() # 通过类创建对象
14 print(phone1) # 地址:0x000001EFF727FE48
15 phone1.call() # call(phone1)
16
17 phone2 = Phone()
18 print(phone2)
19 phone2.call() # call(phone2)
phone:
<__main__.Phone object at 0x00000215015FFDC8>
<__main__.Phone object at 0x00000215015FFDC8>
正在访问通讯录:
正在打电话...
phone2
<__main__.Phone object at 0x00000215015FD108>
<__main__.Phone object at 0x00000215015FD108>
正在访问通讯录:
正在打电话...
4.__init__方法
1 class Phone(): 2 #魔术方法之一:__名字__() 3 def __init__(self): 4 print("=====init===") 5 # Phone类里面的方法:call 6 def call(self): 7 print("===price==") 8 9 phone1 =Phone()
>> =====init===
底层实现流程:
1.phone1 = Phone()利用类创建对象,读到phone()时,首先查找Phone()类。
2.利用Phone类,向内存申请一块和类同样大小的空间。
3.向Phone类中查找有没有__init__方法;若没有,则则将新空间赋值给phone1;
4.若有,则进入__init__方法,执行相应内容,再将内存赋值给对象phone1。
5.__init__中的self为新创建的空间地址,也就是对象phone1。
1 class Phone:
2 # 魔术方法之一: __名字__()-----> 称作魔术方法
3 def __init__(self): # init初始的,初始化--->标准化,保证每一个空间里面都有brand和price两个属性
4 self.brand = 'xioami' # 动态的给self空间中添加了两个属性
5 self.price = 4999
6
7 def call(self): # self是不断变化的
8 print('-------->call')
9 print('价格', self.price) # 不能保证每个self里面都有price
10
11
12 p = Phone()
13 p.call()
14 p1 = Phone()
15 p1.price = 5999
16 p1.call()
17
18 '''
19 -------->call
20 价格 4999
21 -------->call
22 价格 5999
23 '''
其中,self.brand和self.price两句是在执行__init__方法时,在各自的对象内存中动态的创建了各自的属性。
1 class Person:
2 def __init__(self, name, age):
3 self.name = name
4 self.age = age
5
6 def eat(self, food):
7 print('{}正在吃{}!'.format(self.name,food))
8 print('今年{}岁了'.format(self.age))
9
10 def run(self):
11 print('{},今年{}岁了,正在跑步!'.format(self.name, self.age))
12
13
14 p = Person('李四', '18')
15 p.name = '李四'
16 p.age = 20 # 将上面的age=18覆盖
17 p.eat('红烧肉')
18 p.run()
19
20 p1 = Person('王五', 15)
21 p1.name = '王三' # 覆盖了上面的name='王五'
22 p1.age = 25
23 p1.eat('馒头')
24 p1.run()
25 p2 = Person('李琪', 17)
26 p2.run()
27
28 '''
29 李四正在吃红烧肉!
30 今年20岁了
31 李四,今年20岁了,正在跑步!
32 王三正在吃馒头!
33 今年25岁了
34 王三,今年25岁了,正在跑步!
35 李琪,今年17岁了,正在跑步!
36 '''
可以为方法指定参数,那么不同的对象就有不同的属性和方法。参数需要调用时动态传入。
5.类方法
特定:
1、定义需要依赖装饰器@classmethod
2、类方法中的参数不是一个对象(self),而是当前类。
3、类方法中只可以使用类属性。不依赖对象self
4、类方法中不可以使用普通方法。
作用:
由于只能访问类属性和方法,所以可以在对象创建之前,完成一些需要的动作(功能)。
1 class Dog:
2
3 def __init__(self, nickname):
4 self.nickname = nickname
5
6 # 普通方法
7 def run(self): # #self-->对象, 这个方法依赖于对象
8 print('{}在院子里跑来跑去'.format(self.nickname))
9
10 def eat(self):
11 print('吃饭...')
12 self.run() # 类方法中的调用,需要通过self.方法名()
13 @classmethod
14 def test(cls): # class的简写 类方法依赖于类
15 print('------>')
16 print(cls) # <class '__main__.Dog'>
17 # print(cls.nickname) #报错 因为类方法只存在在类空间,不能用对象调用。
18
19
20 dog = Dog('大黄')
21 dog.run()
22 dog.eat()
23 dog.test()
24 Dog.test() # 可以直接调用类方法
25
26 '''
27 大黄在院子里跑来跑去
28 吃饭...
29 大黄在院子里跑来跑去
30 ------>
31 <class '__main__.Dog'>
32 ------>
33 <class '__main__.Dog'>
34 '''
修改类属性
对象方法可以调用类属性,但是不能修改,只能用类修改。
1 class Person():
2 age = 18
3
4 def show(self):
5 print('age--------->', Person.age) # self.age 也可以
6
7
8 p1 = Person()
9 p1.show()
10 p1.age = p1.age + 1 # 修改的对象的年龄 --》不能修改
11 p1.show()
12
13 Person.age = Person.age + 1 # 修改的类的年龄
14 p1.show()
15
16 '''
17 age---------> 18
18 age---------> 18
19 age---------> 19
20 '''
应用与实际中,一般不允许外部修改类属性,所有将类属性私有化
1 class Person():
2 __age = 18 # 加一个__就变成了私有的
3
4 def show(self):
5 print('age-------->', Person.__age) # self.age 也可以
6
7 @classmethod
8 def update_age(cls):
9 cls.__age = 20
10 print('===更新年龄===')
11
12 @classmethod
13 def show_age(cls):
14 print('修改后的年龄时{}'.format(cls.__age))
15
16
17 p2 = Person()
18 p2.show()
19 Person.update_age()
20 Person.show_age()
21
22 '''
23 age--------> 18
24 ===更新年龄===
25 修改后的年龄时20
26 '''
6.静态方法
静态方法:很类似于类方法
1.需要装饰器@staticmethod
2.静态方法是无需去传递参数(cls、self)
3.里面也只能访问类的属性和方法,对象的是无法访问的
4.加载的时机同类方法
总结:类方法和静态方法
相同点:
1.只能访问类的属性和方法,对象是无法访问的
2.都可以通过类名去调用访问
3.都可以在创建对象之前使用,因为是不依赖于对象
不同点:
1.装饰器不同,类方法装饰器为@classmethod,静态方法装饰器为@staticmethod
2.类方法有参数(cls),静态方法没有参数
普通方法 与 类方法和静态方法
不同:
1.普通方法没有装饰器
2.普通方法永远是依赖对象,因为每个普通方法都有一个self
3.普通方法在创建了对象才可以调用对象的方法。
1 class Person():
2 __age = 18 # 加一个__就变成了私有的
3
4 def __init__(self, name):
5 self.name = name # 对象的在类方法和静态方法中无法访问
6
7 def show(self):
8 print('age-------->', Person.__age) # self.age 也可以
9
10 @classmethod
11 def update_age(cls):
12 cls.__age = 20
13 print('===更新年龄===')
14
15 @classmethod
16 def show_age(cls):
17 print('修改后的年龄时{}'.format(cls.__age))
18
19 @staticmethod
20 def test():
21 print('---------->静态方法')
22 # print(self.name) 语法错误
23 print(Person.__age)
24
25
26 p2 = Person('Tom')
27 p2.show()
28 Person.update_age()
29 Person.show_age()
30 Person.test()
31
32 '''
33 age--------> 18
34 ===更新年龄===
35 ===更新年龄===
36 修改后的年龄时20
37 ---------->静态方法
38 20
39 '''
作者:Ambitious
-------------------------------------------
个性签名:独学而无友,则孤陋而寡闻。做一个灵魂有趣的人!
如果觉得这篇文章对你有小小的帮助的话,记得在右下角点个“推荐”哦,博主在此感谢!
万水千山总是情,打赏一分行不行,所以如果你心情还比较高兴,也是可以扫码打赏博主,哈哈哈(っ•̀ω•́)っ✎⁾⁾!