python面向对象<三>

类属性、实例属性

class Tool(object):
    #属性(类属性)类对象(Tool)
    num = 0
    #方法
    def __init__(self,new_name):
        self.name = new_name               #实例属性
        Tool.num += 1                      #(类属性的引用方法)

tool1 = Tool('铁锹')
tool2 = Tool('工兵铲')
tool3 = Tool('水桶')

实例属性:

和具体的某个实例对象有关系
并且一个实例对象和另一个实例对象是不共享属性的

类属性:

类属性所属于类对象
并且多个实例对象之间共享同一个类属性

类方法、实例方法、静态方法:

class Game(object):

    #类属性
    num = 1

    #实例方法:必须要有一个参数,参数用来接触对象(self)
    def __init__(self):
        #实例属性
        self.name = 'laowang'

    #类方法:必须要有一个参数 ,参数进行类的引用
    @classmethod
    def add_num(cls):        #cls:保存类的引用(修改类属性)
        cls.num = 100

    # 静态方法:可以没有任何参数
    @staticmethod
    def  print_menu():
        print('---------------')
        print('穿越火线')
        print('1、开始游戏')
        print('2、结束游戏')
        print('---------------')

#调用类方法
game = Game()
# Game.add_num()        #1、调用类方法#可以通过类的名字调用类方法
game = Game()           #2、还可以通过这个类创建出来的对象去调用这个类方法
print(Game.num)

#调用静态方法
#Game.print_menu()      #1、通过类调用静态方法
game.print_menu()       #2、通过实例对象去调用静态方法

__new__方法:

class Dog(object):
    def __init__(self):
        print('-------init方法------')
    def __del__(self):
        print('-------del方法------')
    def __str__(self):
        print('-------str方法------')
    def __new__(cls):                         # cls时Dog指向的那个对象
        # print(id(cls))
        print('-------NEW方法------')
        return object.__new__(cls)            # 重新调用object类的new方法

# print(id(Dog))
xtq = Dog()  

相当于要做3件事
1、调用__new__方法只来创建对象,然后找一个变量来接受__new__的返回值,这个返回值表示创建出来的对象的引用
2、__init__(刚刚创建出来的对象的应用),__init__只负责初始化
3、返回对象的引用

总结:
  · _new__至少要有一个参数cls,代表要实例化的类。
  · __new__必须要有返回值,返回实例化出来的实例。
  · __init__在__new__的基础上可以完成一些其它初始化的动作,__init__不需要返回值

单例:

1. 单例是什么
  举个常见的单例模式例子,我们日常使用的电脑上都有一个回收站,在整个操作系统中,回收站只能有一个实例,整个系统都使用这个唯一的实例,而且回收站自行提供自己的实例。因此回收站是单例模式的应用。
  确保某一个类只有一个实例,而且自行实例化并向整个系统提供这个实例,这个类称为单例类,单例模式是一种对象创建型模式。

单例:不管创建多少此,都是一个对象。eg:window

class Dog(object):
    __instance = None                      #为了不影响外边,设置成私有属性
    def __new__(cls):
        if cls.__instance == None:
            cls.__instance = object.__new__(cls)
            return cls.__instance
        else:
            #return上一次创建对象的引用
            return cls.__instance
a = Dog()
print(id(a))
b = Dog()
print(id(b))
# >>> 1736945052248
# >>> 1736945052248

单例一次

class Dog(object):
    __instance = None      #为了不影响外边,设置成私有属性
    def __new__(cls,name):
        if cls.__instance == None:
            cls.__instance = object.__new__(cls)
            return cls.__instance
        else:
            #return上一次创建对象的引用
            return cls.__instance
    def __init__(self,name):
        self.name = name

a = Dog('旺财')
print(id(a))
print(a.name)

b = Dog('哮天犬')
print(id(b))
print(b.name)
# >>> 2605269461816
# >>> 旺财
# >>> 2605269461816
# >>> 哮天犬  

只初始化一次:

#单例:不管创建多少此,都是一个对象。eg:window
class Dog(object):
    __instance = None      #为了不影响外边,设置成私有属性
    __init_flag = False
    def __new__(cls,name):
        if cls.__instance == None:
            cls.__instance = object.__new__(cls)
            return cls.__instance
        else:
            #return上一次创建对象的引用
            return cls.__instance
    def __init__(self,name):
        if Dog.__init_flag  == False:
            self.name = name
            Dog.__init_flag = True

a = Dog('旺财')
print(id(a))
print(a.name)

b = Dog('哮天犬')
print(id(b))
print(b.name)
# >>> 2605269461816
# >>> 旺财
# >>> 2605269461816
# >>> 旺财
原文地址:https://www.cnblogs.com/twoo/p/11750519.html