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 # 抛出异常

友情链接

原文地址:https://www.cnblogs.com/huhx/p/baseuselearnpython6.html