Python 11.05错题本

import copy
a = [1, 2, 3, 4, ['a', 'b']] 
b = a 
c = copy.copy(a) 
d = copy.deepcopy(a) 
a.append(5) 
a[4].append('c') 

import copy
a = [1, 2, 3, 4, ['a', 'b']] 
b = a     # 引用,除非直接给a重新赋值,否则a变则b变,b变则a变
c = copy.copy(a)   # 浅复制,只会拷贝父对象, 不会拷贝父对象中的子对象,所以若a的子对象变则c 变,但是父对象变c不会变
d = copy.deepcopy(a) #深拷贝,完全拷贝,完全独立于原对象,a变也不变
a.append(5) # 改变父对象

a[4].append('c')  #改变父对象中的 ['a', 'b']子对象

 

# a=[1, 2, 3, 4, ['a', 'b','c'],5] 

b=[1, 2, 3, 4, ['a', 'b','c'],5] 

c=[1, 2, 3, 4, ['a', 'b','c']] 

d=[1, 2, 3, 4, ['a', 'b']] 

本题在 Python2 下答案选 C,在 Python3 下全部错误。

选项 A:Python2 与 Python3 均不支持复数比较大小,Python2 中会抛出以下错误:

TypeError: no ordering relation is defined for complex numbers

Python3 中会抛出以下错误:

TypeError: '>' not supported between instances of 'complex' and 'complex'

tuple 的比较是从两者的第一个元素的 ASCII 码开始,直至两个元素不相等为止,若前面元素都相等,则元素个数多的 tuple 较大。

1

2

3

4

(1,9) < (2,3) # True

(8,9) < (1,2,3) # False

(1,2,3) == (1,2,3) # True

(3,2) < ('a','b') # True

选项 D:字符串的比较与 tuple 类似,也是从第一个字符开始比较 ASCII 码,直到两个字符不相等为止。

字母与数字的ASCII 码大小范围是 "a-z" > "A-Z" > "0-9",D选项中 'a' < 'x',因此

1

'abc' 'xyz' # False

__new__和__init__的区别

class A(object):
    def __init__(self,*args, **kwargs):
        print "init A"
    def __new__(cls,*args, **kwargs):
        print "new A %s"%cls
     #return super(A, cls).__new__(cls, *args, **kwargs)
        return object.__new__(cls, *args, **kwargs)

1、继承自object的新式类才有__new__

2、__new__至少要有一个参数cls,代表当前类,此参数在实例化时由Python解释器自动识别

3、__new__必须要有返回值,返回实例化出来的实例,这点在自己实现__new__时要特别注意,可以return父类(通过super(当前类名, cls))__new__出来的实例,或者直接是object的__new__出来的实例

4、__init__有一个参数self,就是这个__new__返回的实例,__init__在__new__的基础上可以完成一些其它初始化的动作,__init__不需要返回值

5、如果__new__创建的是当前类的实例,会自动调用__init__函数,通过return语句里面调用的__new__函数的第一个参数是cls来保证是当前类实例,如果是其他类的类名,那么实际创建返回的就是其他类的实例,其实就不会调用当前类的__init__函数,也不会调用其他类的__init__函数。

class B(A):
    def __init__(self,*args, **kwargs):
        print "init B"
    def __new__(cls,*args, **kwargs):
        print "new B %s"%cls
     #return super(B, cls).__new__(cls, *args, **kwargs)
        return object.__new__(cls, *args, **kwargs)

1、在定义子类时没有重新定义__new__()时,Python默认是调用该类的直接父类的__new__()方法来构造该类的实例,如果该类的父类也没有重写__new__(),那么将一直按此规矩追溯至object的__new__()方法,因为object是所有新式类的基类。

2、而如果子类中重写了__new__()方法,那么你可以自由选择任意一个的其他的新式类(必定要是新式类,只有新式类必定都有__new__(),因为所有新式类都是object的后代,而经典类则没有__new__()方法)的__new__()方法来制造实例,包括这个新式类的所有前代类和后代类,只要它们不会造成递归死循环。反正肯定不能调用自己的__new__,这肯定是死循环。

3、对于子类的__init__,其调用规则跟__new__是一致的,当然如果子类和父类的__init__函数都想调用,可以在子类的__init__函数中加入对父类__init__函数的调用。

4、我们在使用时,尽量使用__init__函数,不要去自定义__new__函数,因为这两者在继承派生时的特性还是很不一样的。

class PositiveInteger(int):
    def __init__(self, value):
        super(PositiveInteger, self).__init__(self, abs(value))


i = PositiveInteger(-3)
print i

1、__new__方法主要是当你继承一些不可变的class时(比如int, str, tuple), 提供给你一个自定义这些类的实例化过程的途径。

假如我们需要一个永远都是正数的整数类型,通过集成int,我们可能会写出这样的代码。 

但运行后会发现,结果根本不是我们想的那样,我们仍然得到了-3。这是因为对于int这种 不可变的对象,我们只有重载它的__new__方法才能起到自定义的作用。 
这是修改后的代码: 

class PositiveInteger(int):
    def __new__(cls, value):
        return super(PositiveInteger, cls).__new__(cls, abs(value))


i = PositiveInteger(-3)
print i

通过重载__new__方法,我们实现了需要的功能。

2、实现单例

事实上,当我们理解了__new__方法后,我们还可以利用它来做一些其他有趣的事情,比如实现 设计模式中的 单例模式(singleton) 。 
因为类每一次实例化后产生的过程都是通过__new__来控制的,所以通过重载__new__方法,我们 可以很简单的实现单例模式。 

class Singleton(object):
    def __new__(cls):
        # 关键在于这,每一次实例化的时候,我们都只会返回这同一个instance对象
        if not hasattr(cls, 'instance'):
            cls.instance = super(Singleton, cls).__new__(cls)
        return cls.instance


obj1 = Singleton()
obj2 = Singleton()


obj1.attr1 = 'value1'
print obj1.attr1, obj2.attr1
print obj1 is obj2

输出结果:
value1 value1
True
可以看到obj1和obj2是同一个实例。

class Singleton(object):
    __instance = None


    def __init__(self, *args, **kwargs):
        pass


    def __new__(cls, *args, **kwargs):
        if not cls.__instance:
            # if not hasattr(cls, 'instance'):
            cls.__instance = super(Singleton, cls).__new__(cls, *args, **kwargs)
            cls.__instance.aa = args[0]
            print type(cls), type(cls.__instance), type(cls.__instance.aa)
        return cls.__instance

obj1 = Singleton(1, 2, 3, b=2)
obj2 = Singleton(1, 2, 3, b=2)

obj1.attr1 = 'value1'
obj2.attr2 = 'value2'
print obj1.attr1, obj1.attr2
print obj1 is obj2
print obj1.aa, obj2.attr1

结果:
<type 'type'> <class '__main__.Singleton'> <type 'int'>
value1 value2
True
1 value1

 

3、实现自定义的metaclass。

 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
安装Bacula 11.05在CentOS 7.5上可以按照以下步骤进行: 1. 在CentOS系统上更新软件包列表,以确保安装最新的软件包:sudo yum update 2. 安装必要的软件包,包括MySQL和MariaDB服务器、Development Tools和相关库:sudo yum install mysql-server mysql-devel mariadb-server mariadb-devel gcc make autoconf libtool sudo yum groupinstall "Development Tools" 3. 启动MySQL并设置自动启动:sudo systemctl start mysqld sudo systemctl enable mysqld 4. 为MySQL服务器设置root用户密码,输入以下命令并按照提示操作:sudo mysql_secure_installation 5. 安装Bacula依赖库:sudo yum install zlib-devel openssl-devel readline-devel 6. 下载Bacula 11.05源代码包,可以从Bacula官方网站上下载:https://www.bacula.org/en/ 7. 解压源代码包:tar -zxvf bacula-11.0.5.tar.gz 8. 进入解压后的目录:cd bacula-11.0.5 9. 编译和安装Bacula:./configure --with-mysql make sudo make install 10. 创建Bacula数据库:sudo /usr/libexec/bacula/grant_mysql_privileges -b -u root -p 11. 初始化Bacula数据库:sudo /usr/libexec/bacula/create_bacula_database 12. 创建Bacula数据库表格和用户:sudo /usr/libexec/bacula/make_bacula_tables 13. 编辑配置文件:sudo nano /usr/local/etc/bacula/bacula-dir.conf 根据实际需求,配置Bacula的Director配置文件。 14. 启动Bacula Director服务:sudo systemctl start bacula-dir 15. 设置Bacula Director服务自动启动:sudo systemctl enable bacula-dir 16. 检查Bacula Director服务是否正常运行:sudo systemctl status bacula-dir 现在,您已经成功安装了Bacula 11.05,并可以根据需要进行配置和使用。希望这些步骤能够帮助您!
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值