东行天下

导航

 

一、魔法方法

1.定义
使用 __ 开始,使用 __ 结束
在创建对象时,会自动调用__init__方法
在销毁对象时,会自动调用__del__方法
当打印一个对象的时候,会调用这个对象的 __str__ 或者 __repr__ 方法,如果两个方法都写了,选择 __str__
调用内置函数 repr 会触发对象的 __repr__ 方法
对象名() ==> 调用这个对象的 p.__call__() 方法
# is 比较两个对象的内存地址
# == 会调用对象的 __eq__ 方法,获取这个方法的比较结果,__eq__ 如果不重写,默认比较依然是内存地址
# instance内置函数,用来判断一个实例对象是否是由某一个类(或者它的子类)实例化创建出来的。
# issubclass 用来判断两个类之间的继承关系。
 
 1 # 魔法方法,也叫魔术方法,是内里的特殊的一些方法
 2 # 特点:
 3 # 1.不需要手动调用,会在合适的时机自动调用
 4 # 2. 这些方法,都是使用 __ 开始,使用 __ 结束
 5 # 3. 方法名都是系统规定好的,在合适的时机自己调用
 6 # import datetime
 7 #
 8 # x = datetime.datetime(2020, 2, 24, 16, 17, 45, 200)
 9 # print(x)  # __str__ 方法
10 # print(repr(x))  # __repr__ 方法
11 
12 
13 class Person(object):
14     def __init__(self, name, age):
15         # 在创建对象时,会自动调用这个方法
16         print('__init__方法被调用了')
17         self.name = name
18         self.age = age
19 
20     def __del__(self):
21         # 当对象被销毁时,会自动调用这个方法
22         print('__del__ 方法被调用了')
23 
24     def __repr__(self):
25         return 'hello'
26 
27     def __str__(self):
28         return '姓名:{},年龄:{}'.format(self.name, self.age)
29 
30     def __call__(self, *args, **kwargs):
31         # print('__call__ 方法被调用了')
32         # args = (1, 2, 4, 5),kwargs = {'m':'good', 'n':'hehehe', 'p':'heiheihei'}
33         print('args={},kwargs={}'.format(args, kwargs))
34 
35 
36 p = Person('zhangsan', 18)
37 
38 # 如果不做任何的修改,直接打印一个对象,是文件的 __name__.类型 内存地址
39 # print(p)  # <__main__.Person object at 0x00000217467AEA08>
40 
41 # 当打印一个对象的时候,会调用这个对象的 __str__ 或者 __repr__ 方法
42 # 如果两个方法都写了,选择 __str__
43 print(p)
44 
45 # print(repr(p))  # 调用内置函数 repr 会触发对象的 __repr__ 方法
46 # print(p.__repr__())  # 魔法方法,一般不手动的调用
47 
48 p(1, 2, 4, 5, m='good', n='hehehe', p='heiheihei')  # 对象名() ==> 调用这个对象的 p.__call__() 方法

 二、类

1.类方法

1 class Dog(object):
2     __type = ""
3 
4   # 类方法,用classmethod来进行修饰,当方法中 需要使用类对象 (如访问私有类属性等)时,定义类方法
5     @classmethod
6     def get_type(cls):
7         return cls.__type
8 print(Dog.get_type())

2.静态方法

class Dog(object):
    type = ""

    def __init__(self):
        name = None

    # 静态方法    
    @staticmethod
    def introduce():  # 静态方法不会自动传递实例对象和类对象
        print("犬科哺乳动物,属于食肉目..")

dog1 = Dog()
Dog.introduce()    # 可以用 实例对象 来调用 静态方法
dog1.introduce()    # 可以用 类对象 来调用 静态方法

使用场景:

  • 当方法中 既不需要使用实例对象(如实例对象,实例属性),也不需要使用类对象 (如类属性、类方法、创建实例等)时,定义静态方法
  • 取消不需要的参数传递,有利于 减少不必要的内存占用和性能消耗

3.单例设计模式

确保某一个类只有一个实例,而且自行实例化并向整个系统提供这个实例,这个类称为单例类,单例模式是一种对象创建型模式。

# 实例化一个单例
class Singleton(object):
    __instance = None
    __is_first = True

    def __new__(cls, age, name):
        if not cls.__instance:
            cls.__instance = object.__new__(cls)
        return cls.__instance

    def __init__(self, age, name):
        if self. __is_first: # 不会再创建第二个对象
            self.age = age
            self.name = name
            Singleton. __is_first = False


a = Singleton(18, "张三")
b = Singleton(28, "张三")

print(id(a))
print(id(b))

print(a.age) # 18
print(b.age) # 18

a.age = 19
print(b.age)

 

 
 
posted on 2023-03-14 09:05  东行天下  阅读(19)  评论(0)    收藏  举报