zoukankan      html  css  js  c++  java
  • python学习20之面向对象编程高级

    ''''''
    '''
    1.动态绑定:对于一个类,我们可以对它的实例动态绑定新的属性或方法。
    为了使所有的实例均可以使用动态绑定的属性和方法,我们也可以采用对类直接动态绑定
    '''
    class Student():
    pass

    s1=Student()
    s1.age=18 #对于实例动态绑定属性
    print(s1.age)

    def set_age(self,age):
    self.age=age

    s2=Student()
    s2.set_age=set_age(s2,18) #对于实例动态绑定方法
    print(s2.age)

    Student.set_age=set_age #对于类直接动态绑定一个方法
    s3=Student()
    s3.set_age(20)
    print(s3.age)
    '''
    2._slot_变量 :
    限制实例可以动态绑定的属性
    对于父类的_slot_变量,对子类不起作用
    '''
    class Teacher():
    __slots__ = ('name','age') #用元组的方式进行限制

    t1=Teacher()
    t1.name="Mr. Wang"
    t1.age="22"
    # t1.salary="2000" #AttributeError: 'Teacher' object has no attribute 'salary'
    print(t1.name+":"+t1.age)

    '''
    3.@property
    装饰器
    '''
    class Stu():
    @property
    def score(self):
    return self._score
    @score.setter
    def score(self,value):
    self._score=value

    s4=Stu()
    s4.score=50
    print(s4.score)
    '''
    4.多重继承:一个子类可以同时继承多个父类
    结构: class 子类名(父类名1,父类名2,...)
    5.__iter__:返回迭代对象
    如果一个类想被用于for ... in循环,类似list或tuple那样,就必须实现一个__iter__()方法,该方法返回一个迭代对象,
    然后,Python的for循环就会不断调用该迭代对象的__next__()方法拿到循环的下一个值,直到遇到StopIteration错误时退出循环
    见斐波那契数列
    '''

    # class Fib(object):
    # def __init__(self):
    # self.a, self.b = 0, 1 # 初始化两个计数器a,b
    #
    # def __iter__(self):
    # return self # 实例本身就是迭代对象,故返回自己
    #
    # def __next__(self):
    # self.a, self.b = self.b, self.a + self.b # 计算下一个值
    # if self.a > 100000: # 退出循环的条件
    # raise StopIteration()
    # return self.a #返回下一个值
    # for n in Fib():
    # print(n)
    '''
    要表现得像list那样按照下标取出元素,需要实现__getitem__()方法:
    '''
    class Fib(object):
    def __getitem__(self, n):
    a, b = 1, 1
    for x in range(n):
    a, b = b, a + b
    return a
    f=Fib()
    print(f[2])
    '''
    6.__str__():我们用这个方法可以将用print方法打印出来的东西按照我们的想法输出
    '''
    class Student1(object):
    def __init__(self, name):
    self.name = name
    def __str__(self):
    return "name:"+self.name
    ...
    print(Student1('Tom'))
    '''
    7.__repr__():
    '''
    s=Student1("Alan")
    '''
    不用print函数时,s本身的状态就是<__main__.Student object at 0x109afb310>,
    这是因为直接显示变量调用的不是__str__(),而是__repr__(),
    两者的区别是__str__()返回用户看到的字符串,而__repr__()返回程序开发者看到的字符串,也就是说,__repr__()是为调试服务的。
    解决办法是再定义一个__repr__()。但是通常__str__()和__repr__()代码都是一样的,所以,有个偷懒的写法:
    '''
    class Student2(object):
    def __init__(self, name):
    self.name = name
    def __str__(self):
    return 'Student object (name=%s)' % self.name

    __repr__ = __str__
    '''
    8.枚举类:Enum类
    '''
    from enum import Enum

    Month = Enum('Month', ('Jan', 'Feb', 'Mar', 'Apr', 'May', 'Jun', 'Jul', 'Aug', 'Sep', 'Oct', 'Nov', 'Dec'))
    '''
    这样我们就获得了Month类型的枚举类,可以直接使用Month.Jan来引用一个常量,或者枚举它的所有成员:
    '''
    for name, member in Month.__members__.items():
    print(name, '=>', member, ',', member.value)
    '''
    value属性则是自动赋给成员的int常量,默认从1开始计数。
    '''
  • 相关阅读:
    Log4Net记录到MySql
    创建快照
    grep的用法(CentOS7)及有关正则表达式的使用
    samba
    mkdir
    raid0和raid5的 实验过程
    route
    source和sh执行脚本时的差异
    echo命令的简单用法和实例
    smbpasswd和pdbedit
  • 原文地址:https://www.cnblogs.com/wsxcode/p/12494559.html
Copyright © 2011-2022 走看看