WELCOME

不积跬步,无以至千里;不积小流,无以成江海。

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 '''

 

posted @ 2022-03-28 21:47  Ambitious~  阅读(175)  评论(0)    收藏  举报