zoukankan      html  css  js  c++  java
  • python基础---->python的使用(六)

      这里记录一下python中关于class类的一些知识。不解释就弄不懂的事,就意味着怎样解释也弄不懂。

    python中的类知识

    一、class的属性引用与实例

    class MyClass():
        '''A simple exampel class'''
        i = 12345 # class variable shared by all instances 
    
        def __init__(self, realpart, imagpart):
            self.real = realpart # instance variable unique to each instance
            self.imag = imagpart
    
        def f(self):
            return self.real + 'hello'
    
    
    x = MyClass('huhx', 'linux')
    print(x.real, x.imag, x.i, MyClass.i)  # MyClass.real会报错
    print(MyClass.__doc__, x.__doc__)  # A simple exampel class
    print(MyClass.f(x), x.f())  # huhxhello huhxhello
    • When a class defines an __init__() method, class instantiation automatically invokes __init__() for the newly-created class instance.所以python类的__init__()方法类似于java中构造方法。
    • MyClass类的属性i在所有MyClass的实例中共享,而real和imag就是实例私有,每个MyClass的实例这两个属性值可能是不一样的。关于这个,请看下面的这个例子
     1 class Dog():
     2     tricks = []
     3 
     4     # def __init__(self):
     5     #     self.tricks = []
     6 
     7     def add_tricks(self, trick):
     8         self.tricks.append(trick)
     9 d = Dog()
    10 d.add_tricks('roll over')
    11 e = Dog()
    12 e.add_tricks('play dead')
    13 print(d.tricks, e.tricks) # ['roll over', 'play dead'] ['roll over', 'play dead']

    如果注释掉第二行,打开4、5行。运行的结果:['roll over'] ['play dead']。类的方法还可以定义在类的外面,测试用例如下:

    def f1(self, x, y):
        return min(x, y)
    
    class C():
        f = f1
        def g(self):
            return 'hello world'
    
        h = g
    
    classC = C()
    print(C.f(classC, 2, 45), classC.f(2, 45)) # 2 2
    print(classC.h()) # hello world
    classC.h = 'hello abc'
    print(classC.g(), classC.h) # hello world hello abc

    上述的例子可以看到f1定义在类C的外面,可以正常使用。而且在类中赋值h = g,修改h的值。不会影响到g,说明类中的方法赋值是值传递。

    二、python类的继承与访问权限

    python的继承语法如下,可以支持多层继承。

    class DerivedClassName(Base1, Base2, Base3):
        <statement-1>
        .
        .
        .
        <statement-N>

     关于python的私有变量,提供下述的代码:

    class Student(object):
        def __init__(self, name, score):
            self.__name = name
            self.__score = score
            self._name = name
    
        def print_score(self):
            print('%s: %s' % (self.__name, self.__score))
    
    bart = Student('Bart Simpson', 59)
    # print(bart.__name) # AttributeError: 'Student' object has no attribute '_name'
    print(bart._Student__name)
    print(bart._name) # 约定是外部不能访问,但是实际上外部可以访问。
    print(type(bart)) # <class '__main__.Student'>
    print(isinstance(bart, Student), issubclass(Student, object)) # True True

    python中可以定义一个空的类,属性和方法可以自行添加。

    class Employee:
        pass
    
    john = Employee()  # Create an empty employee record
    
    # Fill the fields of the record
    Employee.name = 'John Doe'
    john.dept = 'computer lab'
    john.salary = 1000
    print(john.name) # John Doe

    三、python类中的Generators与Iterators

    # one way
    for ele in [1, 2, 3]:
        print(ele, end=' ')
    print()
    
    # iter
    s = 'abc'
    it = iter(s)
    print(next(it), next(it), next(it), end=' ')
    print()
    
    # Generators
    def reverse(data):
        for index in range(len(data)-1, -1, -1):
            yield data[index]
    
    for char in reverse('huhx'):
        print(char, end=' ')
    print()
    
    # class next and iter
    class Reverse:
        """Iterator for looping over a sequence backwards."""
        def __init__(self, data):
            self.data = data
            self.index = len(data)
    
        def __iter__(self):
            return self
    
        def __next__(self):
            if self.index == 0:
                raise StopIteration
            self.index = self.index - 1
            return self.data[self.index]
    
    rev = Reverse('linux')
    for char in rev:
        print(char, end=' ')
    
    # 1 2 3
    # a b c
    # x h u h
    # x u n i l

    四、python类的一些特殊方法

      Python允许在定义class的时候,定义一个特殊的__slots__变量,来限制该class实例能添加的属性:

    class Student(object):
        __slots__ = ('name', 'age')
    
    s = Student()
    s.name = 'huhx'
    s.age = 45
    s.score = 45

    运行会报错:

    Traceback (most recent call last):
      File "G:/Java/Go/program/2017-05-18/LearnPython1/test10/huhx5.py", line 8, in <module>
        s.score = 45
    AttributeError: 'Student' object has no attribute 'score'

      Python内置的@property装饰器就是负责把一个方法变成属性调用的。当调用不存在的属性时,比如score,Python解释器会试图调用__getattr__(self, 'score')来尝试获得属性。__str__()方法类似于java类中的toString方法。如下案例

    class Student(object):
        @property
        def score(self):
            return 'score = ' + str(self._score)
    
        @score.setter
        def score(self, value):
            if not isinstance(value, int):
                raise ValueError('score must be an integer!')
            if value < 0 or value > 100:
                raise ValueError('score must between 0 ~ 100!')
            self._score = value
    
        def __str__(self):
            return 'student info: ' + self.score
    
        def __getattr__(self, item):
            if item == 'address':
                return 'china'
            elif item == 'attr_fun':
                return lambda x: x * x
    
    s = Student()
    s.score = 60
    print(s.score) # score = 60
    print(s.address) # china
    print(s.attr_fun(4)) # 16
    print(s) # student info: score = 60
    s.score = 999 # 抛出异常

    友情链接

  • 相关阅读:
    大数据【一】集群配置及ssh免密认证
    安卓测试【三】adb简单命令及monkey使用
    安卓测试【二】eclipse离线安装ADT
    初始化对象的知识细节
    安卓测试【一】android sdk环境变量配置
    自动化测试用例排序(三个算法随机、贪心、额外贪心)
    java实现文件复制粘贴功能
    Javsssist用InsertAt()方法对语句插桩
    Javassist进行方法插桩
    JUnit手动设计测试方法以及与Randoop的自动生成测试的比较
  • 原文地址:https://www.cnblogs.com/huhx/p/baseuselearnpython6.html
Copyright © 2011-2022 走看看