class className:
statement1
...
statementN
def __init__(self,[...):
def __del__(self,[...):
Old Style Class
class OldStyle:
pass
New Style Calss
class NewStyle(object):
pass
dir() # 返回类的属性
type() # 返回类的类型
class className(object):
sex = 'male'
class className(object):
def __init__(self, name, sex):
self.name = name
self.sex = sex
xiaohong.grade = xiaohong.grade + 1
class className(object):
def __init__(self, name, sex, age):
self.name = name # 可以公开访问
self._sex = sex # 私有属性,此类的对象均可访问此属性
self.__age = age # 类似私有属性,只有此类之内可访问,外部也可通过别的方法访问
class Program(object):
name = 'Mike' # 这是类的属性 , 由于Python是动态语言 , 类属性也是可以动态添加和修改的
def __init__(self, age, sex, weight):
self.age = age
self._sex = sex
self.__weight = weight
def get_weight(self):
return self.__weight
if __name__ == '__main__':
Program = Program(22, 'male', 50) # 初始化
print(Program.name)
print(Program.age)
print(Program._sex)
print(Program.get_weight())
print(Program._Program__weight)
class className(object):
def one(self):
pass
def _two(self):
pass
def __three(self):
pass
class DerivedClassName(BaseClassName):
<statement1>
...
<statementN>
class A(object):
def AMethod(self, args):
pass
class B(A):
def BMethon(self, args):
super(B, self).AMethod(args)
class Program(object):
name = 'Mike'
def __init__(self, age, sex, weight):
self.age = age
self._sex = sex
self.__weight = weight
def intro(self):
print('my name is ', self.name)
print('my age is ', self.age)
class BProgram(Program):
def __init__(self, age, sex, weight, language):
super(BProgram, self).__init__(age, sex, weight)
self.language = language
def intro(self):
print('my age is %s\nmy language is %s' % (self.age, self.language))
def introduction(program):
if isinstance(program, Program):
program.intro()
if __name__ == '__main__':
program = Program(12, 'female', 34)
bProgram = BProgram(22, 'male', 50, 'python')
introduction(program)
introduction(bProgram)
class A(object):
def __init__(self, a):
print 'init A...'
self.a = a
class B(A):
def __init__(self, a):
super(B, self).__init__(a)
print 'init B...'
class C(A):
def __init__(self, a):
super(C, self).__init__(a)
print 'init C...'
class D(B, C):
def __init__(self, a):
super(D, self).__init__(a)
print 'init D...'
多重继承通过 super()调用__init__()方法时 , A 虽然被继承了两次,但__init__()只调用一次
class Person(object):
pass
class Student(Person):
pass
class Teacher(Person):
pass
class SkillMixin(object):
pass
class BasketballMixin(SkillMixin):
def skill(self):
return 'basketball'
class FootballMixin(SkillMixin):
def skill(self):
return 'football'
class BStudent(Student, BasketballMixin):
pass
class FTeacher(Teacher, FootballMixin):
pass
if __name__ == '__main__':
s = BStudent()
print(s.skill())
t = FTeacher()
print(t.skill())
_
, 如 : def __init__(self):def __new__(cls)
def __init__(self)
def __del__()
: 实际并不会调用这个方法进行回收 , python的回收机制会自动调用此方法进行回收# 首先调用new方法 , 用于返回自身的一个对象 , 然后将对象交给init方法
class Program(object):
def __new__(cls, *args, **kwargs):
print('call_new_method')
print(args)
return super(Program, cls).__new__(cls)
def __init__(self, name, age, language):
print('call_init_method')
self.name = name
self.age = age
self.language = language
if __name__ == '__main__':
program = Program('John', 22, 'python')
print(program.__dict__)
对于*args与**kwargs
参数的含义详见*args与**kwargs
__setattr__(self, name, value):
def __setattr__(self, name, value):
self.__dict__[name] = value
__getattr__(self, name):
访问这个属性时 , 在没有查找到相应实例属性时被调用__getattribute__(self, name):
每次访问属性时被调用 , 更容易引起无限递归情况 , 使用时小心__delattr__(self, name):
class Program(object):
def __init__(self, name, age):
self.name = name
self.age = age
def __getattribute__(self, name):
# return getattr(self, name) # 引起无限递归
# return self.__dict__[name] # 引起无限递归
return super(Program, self).__getattribute__(name)
def __setattr__(self, name, value):
self.__dict__[name] = value
def __setattr__(self, age, value):
self.__dict__[age] = value
def __getattr__(self, age):
return super(Program, super).__getattr__(age)
if __name__ == '__main__':
p = Program('mike', 22)
print(p.name)
print(p.age)
__str__ :
将对象转换成适合人可以看懂的字符串 , 用于显示给用户 , 当打印一个类的实例对象时,会自动调用str方法,并返回回来一个字符串__repr__ :
将对象转换 为适合机器解读的字符串 , 用于显示给开发人员__unicode__ :
详见unicode与str__dir__ :
可以直接调用此方法 , 展现所有的属性 , 也可以根据需求自定义此方法class Program(object):
def __init__(self, name, age):
self.name = name
if isinstance(age, int):
self.age = age
else:
raise Exception("age must be int")
def __dir__(self):
return self.__dict__.keys()
if __name__ == '__main__':
p = Program('mike', 22)
print(p)
print(dir(p))
class Person(object):
def __init__(self, name, gender, **kwargs):
self.name = name
self.gender = gender
# 任意数量的参数 , 并通过 setattr() 绑定属性
for k, v in kwargs.items():
setattr(self, k, v)
if __name__ == '__main__':
p = Person('Bob', 'Male', age=18, course='Python')
print(p.age)
print(p.course)
getattr(p, 'name') # 获取那么属性值
print(p.name)
setattr(p, 'name', 'Adam') # 设置name属性值为Adam
print(p.name)
getattr(p, 'age', 20) # 获取age属性 , 如果属性不存在 , 就返回默认值20
print(p.age)
class Program(object):
def __init__(self, name, age):
self.name = name
if isinstance(age, int):
self.age = age
else:
raise Exception("age must be int")
def __eq__(self, other):
if isinstance(other, Program):
if self.age == other.age:
return True
else:
return False
else:
raise Exception("the type of object must be Program")
def __add__(self, other):
if isinstance(other, Program):
return self.age + other.age
else:
raise Exception("the type of object must be Program")
if __name__ == '__main__':
p1 = Program('mike', 21)
p2 = Program('john', 20)
print(p1 == p2)
print(p1 + p2)
import math
def add(x, y, f):
return f(x) + f(y)
def sqrt(i, j, k):
return k(i) + k(j)
if __name__ == '__main__':
print(add(-5, 9, abs))
print(sqrt(9, 16, math.sqrt))
def trans(x):
return x*x
if __name__ == '__main__':
print(list(map(trans, [1, 2, 3, 4, 5, 6, 7, 8, 9])))
from functools import reduce
def trans_sum(x, y):
return x + y
if __name__ == '__main__':
print(reduce(trans_sum, [1, 2, 3, 4]))
# 实例1
def is_odd(x):
return x % 2 == 1
if __name__ == '__main__':
print(list(filter(is_odd, [1, 2, 3, 4, 5])))
# 实例2
# s.strip(rm) 删除 s 字符串中开头、结尾处的 rm 序列的字符 , 当rm为空时,默认删除空白符(包括'\n', '\r', '\t', ' ')
def is_not_empty(s):
return s and len(s.strip()) > 0
if __name__ == '__main__':
print(list(filter(is_not_empty, ['test', None, '', 'str', ' ', 'END'])))
>>>sorted([36, 5, 12, 9, 21])
[5, 9, 12, 21, 36]
# 方法1
def cmp_ignore_case(x):
return x.upper()
if __name__ == '__main__':
print(sorted(['bob', 'about', 'Zoo', 'Credit'], key=cmp_ignore_case))
# 方法2
print(sorted(['bob', 'about', 'Zoo', 'Credit'], key=lambda x: x.upper()))
lambda详见 : lambda
def f():
print('call f()...')
def g():
print('call g()...')
return g
函数 f 内部又定义了一个函数 g , 由于函数 g 也是一个对象 , 函数名 g 就是指向函数 g 的变量 , 所以 , 最外层函数 f 可以返回变量 g , 也就是函数 g 本身
本文章参考课程链接
https://www.imooc.com/video/13273
https://www.imooc.com/video/6042