Python 面向对象编程进阶

 


1. 面向对象高级语法 

1.1 静态方法

  • 静态方法:只是名义上归类管理,实际上在静态方法里访问不了类或实例中的任何属性。
  • 通过@staticmethod装饰器即可把其装饰的方法变为一个静态方法,什么是静态方法呢?其实不难理解,普通的方法,可以在实例化后直接调用,并且在方法里可以通过self.调用实例变量或类变量,但静态方法是不可以访问实例变量或类变量的,一个不能访问实例变量和类变量的方法,其实相当于跟类本身已经没什么关系了,它与类唯一的关联就是需要通过类名来调用这个方法
1
2
3
4
5
6
7
8
9
class Dog(object):
    def __init__(self,name):
        self.name = name
    @staticmethod   # 普通函数,实际上跟类没什么关系了
    def eat(self):
        print("%s is eating %s" %(self.name,"骨头"))
 
d = Dog("狗")
d.eat(d)

1.2 类方法  

  • 类方法:通过@classmethod装饰器实现,类方法和普通方法的区别是: 类方法只能访问类变量,不能访问实例变量
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
class Dog(object):
    n = "狗"  # 类变量
    def __init__(self,name):
        self.name = name  # 实例变量
    #@classmethod   # 类方法只能访问类变量
    @classmethod
    def eat(self):
        print("%s is eating %s" %(self.n,"骨头"))
        # 会报错不能访问实例变量
        # print("%s is eating %s" %(self.name,"骨头"))
 
    def talk(self):
        print("%s is talking" %self.name)
d = Dog("泰迪")
d.eat()

 

1.3 属性方法  

  • 属性方法:作用就是通过@property把一个方法变成一个静态属性。
  • 属性方法不能传参,可以赋值。
    • 通过@property把 eat(self) 方法变成静态属性。 
    • 再写一个eat方法,通过 @方法名.setter(@eat.setter)的方式赋值 
      • @eat.setter 赋值 
      • @eat.getter 获取 
      • @eat.deleter  删除
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
class Dog(object):
    def __init__(self,name):
        self.name = name
        self.__food = None
    @property       # 静态属性
    def eat(self):
        print("%s is eating %s" %(self.name,self.__food))
    @eat.setter     # 静态属性赋值,需要再写一个eat方法
    def eat(self,food):
        print("set to food:",food)
        self.__food = food
    @eat.deleter    # 静态属性删除方法。
    def eat(self):
        del self.__food
        print("删完了")
    def talk(self):
        print("%s is talking" %self.name)
d = Dog("狗")
 
d.eat
# 赋值
d.eat="骨头"
d.eat
# 删除属性
del d.eat

  

2. 类的特殊成员方法

2.1 __doc__

  • __doc__  类的描述信息

5.2 __module__ 和  __class__ 

  • __module__ 表示当前操作的对象在那个模块
  • __class__     表示当前操作的对象的类是什么

 a类:

1
2
3
class c:
    def __init__(self):
        self.name = "C"

b类:

1
2
3
4
from a import c
obj = c()
print(obj.__module__)   # 输出:a,输出模块
print(obj.__class__)    # 输出:<class 'a.c'>,输出类

2.3 __init__

  • __init__  构造方法,通过类创建对象时,自动触发执行。
1
2
3
4
5
6
7
8
class Student():
    def __init__(self):
        self.name = "jack"
        self.age = 18
    def info(self):
        print(f"{self.name}今年{self.age}岁了")
stu = Student()
stu.info()

接受外部传参

1
2
3
4
5
6
7
8
class Student():
    def __init__(self,name,age):
        self.name = name
        self.age = age
    def info(self):
        print(f"{self.name}今年{self.age}岁了")
stu = Student("Jack",18)
stu.info()

2.4 __del__

  • 析构方法,当对象在内存中被释放时,自动触发执行。
1
2
3
4
5
class Foo:
    def __del__(self):
        print(f'{self}对象已被释放')
 
obj = Foo()

 2.5 __call__ 

  • 对象后面加括号,触发执行。

注:构造方法的执行是由创建对象触发的,即:对象 = 类名() ;而对于 __call__ 方法的执行是由对象后加括号触发的,即:对象() 或者 类()()

1
2
3
4
5
6
7
8
9
10
11
class A:
    def __init__(self):
        self.name = "C"
 
    def __call__(self, *args, **kwargs):
        print("running call",args,kwargs)
a = A()
# 运行 call
A()()
# 运行 call
a(1,2,3,name="Tom")

2.6 __dict__

  • __dict__ 查看类或对象中的所有成员  
1
2
print(Dog.__dict__) #打印类里的所有属性,不包括实例变量
print(d.__dict__)   #打印类里的实例变量,不包括类属性

  

2.7 __str__ 

  • 如果一个类中定义了__str__方法,那么在打印 对象 时,默认输出str方法的返回值。
1
2
3
4
5
6
class Foo:
    def __str__(self):  
        return '返回值'
 
obj = Foo()
print(obj) # 输出:返回值<br>print(obj) # 如果不写 __str__ 返回 obj的地址值

2.8 __getitem__、__setitem__、__delitem__

  • 用于索引操作,如字典。以上分别表示获取、设置、删除数据
  • getitem  获取
  • setitem  设置
  • delitem  删除
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
class Foo(object):
  
    def __getitem__(self, key):
        print('__getitem__',key)
  
    def __setitem__(self, key, value):
        print('__setitem__',key,value)
  
    def __delitem__(self, key):
        print('__delitem__',key)
  
  
obj = Foo()
  
result = obj['k1']      # 自动触发执行 __getitem__
obj['k2'] = 'alex'   # 自动触发执行 __setitem__
del obj['k1']

2.9 __metalass__ 和 __new__

  • __metalass__ 其用来表示该类由 谁 来实例化创建
  • __new__ 触发 __init__创建实例
posted @   Crazy丶迷恋  阅读(221)  评论(0编辑  收藏  举报
编辑推荐:
· 智能桌面机器人:用.NET IoT库控制舵机并多方法播放表情
· Linux glibc自带哈希表的用例及性能测试
· 深入理解 Mybatis 分库分表执行原理
· 如何打造一个高并发系统?
· .NET Core GC压缩(compact_phase)底层原理浅谈
阅读排行:
· 手把手教你在本地部署DeepSeek R1,搭建web-ui ,建议收藏!
· 新年开篇:在本地部署DeepSeek大模型实现联网增强的AI应用
· Janus Pro:DeepSeek 开源革新,多模态 AI 的未来
· 互联网不景气了那就玩玩嵌入式吧,用纯.NET开发并制作一个智能桌面机器人(三):用.NET IoT库
· 【非技术】说说2024年我都干了些啥
点击右上角即可分享
微信分享提示