码迷,mamicode.com
首页 > 其他好文 > 详细

面向对象练习题

时间:2018-03-02 14:43:55      阅读:1515      评论:0      收藏:0      [点我收藏+]

标签:singleton   div   统计   ini   gpo   pre   .post   mysq   word   

面向对象练习题

1、实现单例模式

姿势1,利用classmethod实现

class Mysql:
    __instance = None
    def __init__(self, host="127.0.0.1", post=9999):
        self.host = host
        self.post = post
        

    @classmethod
    def single(cls,):
        if not cls.__instance:
            cls.__instance = cls()
        return cls.__instance



sql1 = Mysql()
sql2 = Mysql()
print(sql1 is sql2)
sql3 = Mysql.single()
sql4 = Mysql.single()
print(sql3 is sql4)

姿势2,自定义元类

class Mymeta(type):
    __instance = None
    # def __init__(self, *args, **kwargs):
    #   super().__init__(*args, **kwargs)
    def __call__(self, *args, **kwargs):
        if not self.__instance:
            super().__call__(*args, **kwargs)
        # print(‘__instance‘,self.__instance)
        return self.__instance



class Mysql(metaclass=Mymeta):
    def __init__(self, host=‘127.0.0.1‘, post=9999):
        self.host = host
        self.post = post


a = Mysql()
b = Mysql()
print(a is b )

姿势3

class Singleton:
    __instance = None
    def __new__(self, *args, **kwargs):
        if not self.__instance:
            super().__new__(self, *args, **kwargs) 


p1 = Singleton()
p2 = Singleton()
print(p1 is p2)

2、编写程序, 在元类中控制把自定义类的数据属性都变成大写

class Mymeta(type):
    def __new__(cls,name, bases, dics):
        update_dic = {}
        for k,v in dics.items():
            if not callable(v) and not k.startswith("__"):
                update_dic[k.upper()] = v
            else:
                update_dic[k] = v
        return type.__new__(cls,name, bases, update_dic)


class Chinese(metaclass=Mymeta):
    country = "china"
    sex = ‘male‘

print(Chinese.__dict__)

3、编写程序, 在元类中控制自定义的类无需init方法.

class MyMeta(type):
    def __call__(self, *args, **kwargs):
        if args:
            raise typeError("must be keyword argument")

        obj = object.__new__(self)
        for k, v in kwargs.items():
            obj.__dict__[k]=v
        return obj

class Chinese(metaclass=MyMeta):
    country = ‘china‘


p1 = Chinese(name=‘alex‘, age=18)
print(p1, p1.country)
print(p1.__dict__)

4、编写程序, 编写一个学生类, 要求有一个计数器的属性, 统计总共实例化了多少个学生.

class Student:
    i = 0
    def __init__(self, name):
        self.name = name
        Student.i += 1
        
    
    @classmethod
    def count(cls):
        
        return cls.i
        

        

a = Student("a")
b = Student("b") 
print(Student.count())

5、编写程序, A 继承了 B, 俩个类都实现了 handle 方法, 在 A 中的 handle 方法中调用 B 的 handle 方法

class B:
    def handle(self):
        print("B handle")


class A(B):
    def handle(self):
        super(A, self).handle()
        print("a handle")



a = A()
a.handle()

面向对象练习题

标签:singleton   div   统计   ini   gpo   pre   .post   mysq   word   

原文地址:https://www.cnblogs.com/Jason-lin/p/8492217.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!