python理论加强(二)

命令行参数

命令行参数格式为

python my.py v1 v2 

可以通过以下查看参数的值,需要注意的是,argv[0]指的是脚本自身路径,argv[1]才为第一个参数V1

from sys import argv 

继承

子类只继承父类非私有方法,要想使用父类属性,需要调用父类init方法,但当继承关系为菱形继承时,会出现父类初始化多次的问题,这叫做二义性问题

为了解决这种问题,使用super关键字来调用父类init方法

  • suoer关键字的作用:

    super().__init__相对于类名.__init__,在单继承上用法基本无差

    但是在多继承中,如下图菱形继承,super不会重复初始化父类,他是利用类的MOR顺序调用当前类在MOR顺序中的下一个类
    在这里插入图片描述

  • MOR规则

    mor是能把多继承的层次关系转换为线性结构的一种规则,底层基于c3算法。子类优先,先继承优先。如上图,A是B,C的父类,B,C是D的父类,所以优先顺序是D,BC,A,由于在定义D类时,D类先继承B类在继承C类,所以最后顺序为DBCA

  • 多继承传参问题

    在多继承中,初始化子类对象时,子类对象要把父类需要的参数全部传递进去,如果参数容易引起混乱,指定关键字传参即可

property

一种用起来像是使用的实例属性一样的特殊属性,可以对应于某个方法

  • 平时我们是这样调用私有属性的
class People():
    def __init__(self,name):
        self.__name=name
    def get_name(self):
        return self.__name
    def set_name(self,name):
        self.__name=name
    def del_name(self):
        del self.__name

people=People("xzp")
print(people.get_name())
people.set_name("ldd")
print(people.get_name())

当我们用property时可以向平时调用普通属性那样,property自动为我们做了封装

  • property有2种方法可以简化这种操作方法一

    • 方法一
    class Goods(object):
    
        def __init__(self):
            self.__price=100
    
        def get_price(self):
            return self.__price
    
        def set_price(self, value):
            self.__price=value
    
        def del_price(self):
            del self.__price
    
        price=property(get_price,set_price,del_price,"price")
    
    good=Goods()
    print(good.price)
    good.price=200
    print(good.price)
    
    • 方法二
    class Goods(object):
    
        def __init__(self):
            self.__price=100
    	
        @property
        def get_price(self):
            return self.__price
    	@property.setter
        def set_price(self, value):
            self.__price=value
    	@property.deleter
        def del_price(self):
            del self.__price
    
    good=Goods()
    print(good.price)
    good.price=200
    print(good.price)
    

魔法属性和方法

__doc__

  • 表示类的描述信息
class Foo:
    """ 描述类信息,这是用于看片的神奇 """
    def func(self):
        pass

print(Foo.__doc__)
#输出:类的描述信息

__module__ 和 __class__

  • module 表示当前操作的对象在那个模块
  • class 表示当前操作的对象的类是什么

test.py

# -*- coding:utf-8 -*-

class Person(object):
    def __init__(self):
        self.name = 'laowang'

main.py

from test import Person

obj = Person()
print(obj.__module__)  # 输出 test 即:输出模块
print(obj.__class__)  # 输出 test.Person 即:输出类

__init__

  • 初始化方法,通过类创建对象时,自动触发执行
class Person:
    def __init__(self, name):
        self.name = name
        self.age = 18


obj = Person('laowang')  # 自动执行类中的 __init__ 方法

__del__

  • 当对象在内存中被释放时,自动触发执行。

注:此方法一般无须定义,因为Python是一门高级语言,程序员在使用时无需关心内存的分配和释放,因为此工作都是交给Python解释器来执行,所以,__del__的调用是由解释器在进行垃圾回收时自动触发执行的。

class Foo:
    def __del__(self):
        pass

__call__

  • 对象后面加括号,触发执行。

注:__init__方法的执行是由创建对象触发的,即:对象 = 类名() ;而对于 call 方法的执行是由对象后加括号触发的,即:对象() 或者 类()()

class Foo:
    def __init__(self):
        pass

    def __call__(self, *args, **kwargs):
        print('__call__')


obj = Foo()  # 执行 __init__
obj()  # 执行 __call__

__dict__

  • 类或对象中的所有属性

类的实例属性属于对象;类中的类属性和方法等属于类,即:

class Province(object):
    country = 'China'

    def __init__(self, name, count):
        self.name = name
        self.count = count

    def func(self, *args, **kwargs):
        print('func')

# 获取类的属性,即:类属性、方法、
print(Province.__dict__)
# 输出:{'__dict__': <attribute '__dict__' of 'Province' objects>, '__module__': '__main__', 'country': 'China', '__doc__': None, '__weakref__': <attribute '__weakref__' of 'Province' objects>, 'func': <function Province.func at 0x101897950>, '__init__': <function Province.__init__ at 0x1018978c8>}

obj1 = Province('山东', 10000)
print(obj1.__dict__)
# 获取 对象obj1 的属性
# 输出:{'count': 10000, 'name': '山东'}

obj2 = Province('山西', 20000)
print(obj2.__dict__)
# 获取 对象obj1 的属性
# 输出:{'count': 20000, 'name': '山西'}

__str__

  • 如果一个类中定义了__str__方法,那么在打印 对象 时,默认输出该方法的返回值。
class Foo:
    def __str__(self):
        return 'laotie'


obj = Foo()
print(obj)
# 输出:laotie

__getitem__、__setitem__、__delitem__

  • 用于索引操作,如字典。以上分别表示获取、设置、删除数据
# -*- coding:utf-8 -*-

class Foo(object):

    def __getitem__(self, key):
        print('__getitem__', key)

    def __setitem__(self, key, value):
        print('__setitem__', key, value)

    def __delitem__(self, key):
        print('__delitem__', key)


obj = Foo()

result = obj['k1']      # 自动触发执行 __getitem__
obj['k2'] = 'laotie'    # 自动触发执行 __setitem__
del obj['k1']           # 自动触发执行 __delitem__

上下文管理器

with open("output.txt", "r") as f:
        f.write("Python之禅")

上下文管理器本质就是能够支持with操作。

任何实现了 enter() 和 exit() 方法的对象都可称之为上下文管理器,上下文管理器对象可以使用 with 关键字。显然,文件(file)对象也实现了上下文管理器协议。
在这里插入图片描述

猜你喜欢

转载自blog.csdn.net/qq_36217796/article/details/83961144