一、魔法方法
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)
浙公网安备 33010602011771号